본문 바로가기
Swfit/짧은 정리

Xcode 로컬 패키지 추가하는 두 가지 방법

by GGShin 2026. 8. 16.

로컬 폴더를 추가하는 방법은 두 가지입니다. `File ▸ Add Package Dependencies` 로 들어가는 것까지는 동일하고, 그 다음에 어떻게 하느냐에 따라 달라지게 됩니다. 

1. 우측 상단 검색 칸에 경로 입력

이 칸은 패키지 이름으로 검색도 되지만, 주소 형태가 들어오면 저장소 주소로 받아들입니다. https:// 로 시작하든 /Users/ 로 시작하든 상관 없이 똑같이 clone의 대상으로 인식합니다. 

2. 좌측 하단 Add Local… 버튼

Finder에서 폴더를 직접 고르는 방법입니다. git을 거치지 않고, 어딘가에서 받아올 외부 의존성이 아니라 내 프로젝트에 딸린 소스 코드로 다룹니다. 폴더에 있는 파일을 그 자리에서 그대로 빌드합니다.

 

이 두 가지 중에 어느 방법을 사용하던 정상적으로 추가가 되지만, 방법에 따라 결과가 달라집니다.

 

  경로 입력 방법 Add Local 버튼 방법
pbxproj XCRemoteSwiftPackageReference / repositoryURL XCLocalSwiftPackageReference / relativePath
기록되는 경로 절대 경로 (/Users/me/…) 상대 경로 (../../…)
실제 빌드 대상 DerivedData 안의 clone 사본 그 폴더 자체

 

 

저는 이 차이를 몰랐고 이번에 1번 방식으로 로컬 패키지를 연결했습니다. 

앱과 패키지를 나란히 개발하고 있는데, 앱 코드에서 패키지의 프로퍼티 하나가 필요해져서 패키지 쪽에서 접근 제어자를 public으로 열어주었습니다. 저장을 하고 앱을 빌드를 하는 데, 

 

" 'target' is inaccessible due to 'internal' protection level "

 

라는 에러가 발생하는 것이었습니다. 몇 번이고 package cache도 지워보고 derived data도 지워보고 dependency 설정도 다시 해주고 해도 동일한 컴파일 에러가 없어지질 않았습니다. 

 

그러던 찰나에 project.pbxproj 를 확인해 보니 

    XCRemoteSwiftPackageReference "MyKit" = {
        isa = XCRemoteSwiftPackageReference;
        repositoryURL = /Users/me/Projects/MyKit;
        requirement = { branch = main; kind = branch; };
    };



repositoryURL 이 로컬 경로인데 종류는 'XCRemoteSwiftPackageReference'라고 되어 있는 것을 확인할 수 있었습니다. 즉, 해당 경로의 폴더를 직접 읽지 않고, 사본을 하나 떠서 DerivedData 안에 두고 그 사본을 컴파일하는 방식으로 동작하고 있었기 때문에 아무리 local에서 변경 작업을 해도 반영되지 않았던 겁니다. 

 

덕분에 두 방식 차이를 알게 되었던 좋은 경험이었습니다. :)

 

정리
- URL 칸에 로컬 경로를 입력하면 Xcode는 그걸 git 저장소로 보고 clone을 빌드합니다.
- 지금 폴더에 있는 파일 그대로를 빌드하려면 Add Local… 또는 폴더 drag & drop으로 추가해야 합니다.

반응형