🔥 패키지 편집하기

496자
7분

Swift 패키지 매니저는 의존성 편집을 지원합니다. 여러분이 작업하는 도중에 의존성 중 하나를 변경해야 할 때(예: 버그를 수정하거나 새로운 API를 추가할 때) 유용하게 사용할 수 있어요. 패키지 매니저는 의존성을 Packages/ 디렉토리 아래의 위치로 옮겨서 편집할 수 있게 해준답니다.

패키지를 편집 모드로 전환하면 swift build 명령어는 항상 Packages/ 디렉토리에 있는 소스 코드를 사용해서 빌드를 수행해요. 소스 코드의 상태나 Git 저장소의 상태, 심지어 의존성 해결 과정에서 지정된 태그도 빌드에 영향을 주지 않아요. 쉽게 말해서 편집 모드에서는 Packages/ 디렉토리에 있는 소스 코드가 있는 그대로 빌드된다는 거죠.

편집 모드로 전환된 패키지는 의존성 그래프 상에서 해당 패키지를 필요로 하는 모든 곳에 영향을 준답니다. 예를 들어 프로젝트 A와 프로젝트 B가 모두 패키지 C에 의존한다고 해 보죠. 패키지 C를 편집 모드로 전환하면 프로젝트 A와 B 모두 편집된 패키지 C의 소스 코드를 사용하게 돼요.

여러분은 각 패키지를 편집 모드로 전환할지 말지 자유롭게 선택할 수 있어요. 의존성 그래프에 있는 모든 패키지를 편집 모드로 전환할 수도 있고, 일부만 편집 모드로 전환할 수도 있죠. 심지어 아무 패키지도 편집 모드로 전환하지 않을 수도 있어요. 이처럼 편집 모드는 매우 유연하게 사용할 수 있답니다.

편집 가능한 패키지는 의존성 코드로 실험을 하거나, 의존성 소유자의 저장소(업스트림)에서 패치를 생성하고 제출하는 데 가장 적합해요. 패키지를 편집 가능한 상태로 만드는 두 가지 방법이 있어요:

$ swift package edit Foo --branch bugFix
shell

이것은 현재 resolved된 버전에서 bugFix라는 branch를 생성하고 의존성 FooPackages/ 디렉토리에 넣을 거예요.

$ swift package edit Foo --revision 969c6a9
shell

이것은 이전 버전과 유사하지만, 패키지 매니저가 지정된 revision에서 detached HEAD로 의존성을 두는 점이 달라요.

참고: branch나 revision 옵션이 제공되지 않으면 패키지 매니저는 현재 resolved된 버전을 detached HEAD에서 checkout할 거예요.

패키지가 편집 가능한 상태가 되면 Packages/Foo 디렉토리로 이동하여 변경하고, 빌드한 다음 변경 사항을 push하거나 upstream 저장소에 pull request를 열 수 있어요.

unedit 명령을 사용하여 패키지 편집을 종료할 수 있죠:

$ swift package unedit Foo
shell

이렇게 하면 편집된 의존성이 Packages/에서 제거되고 원래 resolved된 버전으로 돌아갈 거예요.

이 명령은 커밋되지 않은 변경 사항이나 원격 저장소에 push되지 않은 변경 사항이 있을 경우 실패해요. 이런 변경 사항을 버리고 unedit하려면 --force 옵션을 사용하면 된답니다:

$ swift package unedit Foo --force
shell

최신 버전 개발

이 기능을 사용하면 파일 시스템의 로컬 체크아웃으로 의존성을 대체(override)할 수 있어요. 이 체크아웃은 패지지 매니저에 의해 전혀 관리되지 않으며 있는 그대로 사용될 거예요. 유일한 요구사항은 대체된(override) 체크아웃의 패키지 이름이 변경되지 않아야 한다는 거죠. 이는 여러 패키지를 동시에 개발하거나 애플리케이션과 함께 패키지로 작업할 때 매우 유용해요.

로컬 체크아웃을 연결(또는 생성)하는 명령은 다음과 같아요:

$ swift package edit <package name> --path <path/to/dependency>
shell

예를 들어, FooBar에 의존하고 /workspace/barBar의 체크아웃이 있는 경우:

foo$ swift package edit Bar --path /workspace/bar
shell

주어진 경로에 Bar의 체크아웃이 없으면 생성될 거예요. 체크아웃이 존재하는 경우 패지지 매니저는 주어진 경로에서 패키지 이름의 유효성을 검사하고 연결할 거예요.

패지지 매니저는 또한 Packages/ 디렉토리에 체크아웃 경로에 대한 바로가기(symlink)를 생성할 거예요.

로컬 체크아웃 사용을 중지하려면 unedit 명령을 사용하세요:

$ swift package unedit <package name>
# 예:
$ swift package unedit Bar
shell

이렇게 Swift 패지지 매니저를 사용해서 편리하게 최신 버전의 패키지를 개발할 수 있답니다. 의존성의 최신 버전을 직접 수정해야 할 때 강력하게 활용해 보세요!