🔥 Swift 버전별 로직 다루기

468자
7분

안녕하세요! Swift Package Manager가 여러 버전의 Swift 프로젝트를 지원할 수 있도록 돕는 방법에 대해 알아보겠습니다. 언어 버전과 패키지 매니저 버전 모두 다양한 Swift 프로젝트 버전과 호환되는 패키지를 만들 수 있어요.

대부분의 경우, 패키지에서 여러 Swift 버전을 지원하려면 소스 코드 자체에서 사용할 수 있는 언어별 버전 검사를 사용하는 게 좋아요. 하지만 패키지 매니페스트 자체를 Swift 버전에 구애받지 않고 작성할 수 없는 경우처럼 일부 상황에서는 관리하기 어려울 수 있죠. 예를 들어, 이전 버전에는 없는 새로운 패키지 매니저 기능을 선택적으로 채택하기 때문이에요.

이런 상황을 위해 패키지 매니저는 패키지 매니페스트와 고려할 패키지 버전 모두에 대해 Swift 버전별 사용자 지정을 허용하는 메커니즘을 지원해요.

버전별 태그 선택

클라이언트가 사용할 수 있는 패키지 버전을 정의하는 태그는 선택적으로 @swift-3과 같은 형식의 마커로 접미사를 붙일 수 있어요. 패키지 매니저가 저장소에 사용 가능한 태그를 결정할 때, 현재 도구 버전과 일치하는 버전별 마커가 있다면 버전별 마커가 있는 버전만 고려합니다. 반대로 버전별 태그는 일치하지 않는 도구 버전에서는 무시됩니다.

예를 들어, Foo 패키지에 [1.0.0, 1.2.0@swift-3, 1.3.0] 태그가 있다고 가정해 보세요.

lecture image

패키지 매니저 버전 3.0에서 이 저장소에 사용 가능한 버전을 평가하면 버전 1.2.0만 고려합니다.

lecture image

하지만 버전 4.0에서는 1.0.01.3.0만 고려하겠죠.

lecture image

이 기능은 다음과 같은 시나리오에서 사용하기 위한 것이에요:

  1. 패키지에서 이전 버전에서는 Swift 3.0을 지원하고 싶지만, 패키지의 새 버전에서는 매니페스트를 읽을 수 있도록 Swift 4.0이 필요한 경우. Swift 3.0은 해당 버전을 무시해야 한다는 것을 알지 못하므로, 조치를 취하지 않으면 패키지에서 종속성 해결을 수행할 때 실패하게 됩니다. 이 경우 작성자는 Swift 3.0을 지원하는 마지막 버전에 적절하게 다시 태그를 지정할 수 있어요.
  2. 패키지에서 동일한 버전 번호로 Swift 3.0과 Swift 4.0을 모두 지원하고 싶지만, 이를 위해서는 코드에 상당한 차이가 필요한 경우. 이 경우 작성자는 두 버전 모두에 대해 병렬 태그 세트를 유지할 수 있습니다.

패키지는 기존 클라이언트를 지원하기 위해 절대적으로 필요한 경우가 아니라면 이 기능을 사용하지 않을 것으로 예상됩니다. 특히, 패키지는 최신 GM Swift 버전을 지원하는 버전에 태그를 지정할 때 이 구문을 채택해서는 안 됩니다.

패키지 매니저는 다음과 같은 표시된 태그를 선호하는 순서대로 찾습니다:

  1. MAJOR.MINOR.PATCH (예: 1.2.0@swift-3.1.2)
  2. MAJOR.MINOR (예: 1.2.0@swift-3.1)
  3. MAJOR (예: 1.2.0@swift-3)

버전별 매니페스트 선택

패키지 매니저는 Package@swift-3.swift 형식의 매니페스트를 검색하여 패키지의 특정 버전을 로드할 때 버전별로 표시된 매니페스트 버전도 추가로 찾습니다. 찾는 마커 세트는 버전별 태그 선택과 동일해요.

이 기능은 패키지에서 여러 Swift 프로젝트 버전과의 호환성을 유지하려는 경우를 위한 것이지만, 이를 위해서는 실질적으로 다른 매니페스트 파일이 필요합니다(예: 매니페스트 API의 변경으로 인해).

패키지는 기존 클라이언트를 지원하기 위해 절대적으로 필요한 경우가 아니라면 이 기능을 사용하지 않을 것으로 예상됩니다. 특히, 패키지는 최신 GM Swift 버전을 지원하는 버전에 태그를 지정할 때 이 구문을 채택해서는 안 됩니다.

현재 Swift 버전이 버전별 매니페스트와 일치하지 않는 경우, 패키지 매니저는 가장 호환되는 도구 버전의 매니페스트를 선택합니다. 예를 들어, 다음과 같은 세 가지 매니페스트가 있는 경우:

Package.swift (도구 버전 3.0)
Package@swift-4.swift (도구 버전 4.0)
Package@swift-4.2.swift (도구 버전 4.2)

lecture image

패키지 매니저는 Swift 3에서 Package.swift를, Swift 4에서 Package@swift-4.swift를, Swift 4.2 이상에서는 Package@swift-4.2.swift를 선택합니다. 도구 버전이 향후 패키지 매니저 버전과 가장 호환되기 때문이죠.