🔥 Package Dependency

714자
8분

Swift 패키지 매니저로 패키지를 만들다 보면 다른 패키지를 사용해야 할 때가 많습니다. 이럴 때 바로 Package.Dependency를 쓰면 됩니다.

Package.Dependency는 두 가지로 이루어져 있어요. 패키지의 Git URL과 버전 조건이에요. Swift 패키지 매니저는 의존성 해결 과정을 통해 앱이나 다른 Swift 패키지에서 쓸 수 있는 패키지 의존성의 정확한 버전을 찾아냅니다.

의존성 해결 결과는 Package.resolved 파일에 기록되고, 이 파일은 Swift 패키지의 최상위 폴더에 있어요. 만약 Apple 플랫폼용 앱에 Swift 패키지를 패키지 의존성으로 넣었다면 .xcodeproj 또는 .xcworkspace 안에서 Package.resolved 파일을 찾을 수 있어요.

이제 Package.Dependency의 주요 메서드들을 하나씩 살펴볼게요.

package(url:from:)

이 메서드는 정해진 최소 버전에서 시작해서 다음 큰 버전 전까지의 버전 조건을 쓰는 패키지 의존성을 만듭니다. 원격 패키지 의존성을 지정할 때 추천하는 방법이에요.

/// 최소 버전을 정하고, 버그 수정과 하위 호환성을 유지하는 기능 업데이트를 허용하지만,
/// 새로운 큰 버전으로의 업데이트는 직접 해야 합니다.
///
/// 다음 예제는 Swift 패키지 매니저가 `1.2.3`, `1.2.4`, `1.3.0` 등의 버전은 고를 수 있지만,
/// `2.0.0`은 고를 수 없어요.
///
///    .package(url: "<https://example.com/example-package.git>", from: "1.2.3"),
///
/// - Parameters:
///     - url: 패키지의 올바른 Git URL.
///     - version: 최소 버전 조건.
static func package(url: String, from version: Version) -> Package.Dependency
swift

이 방법은 쓸 버전을 유연하게 정할 수 있으면서도 호환성을 깨는 변경사항이 있는 버전으로 업데이트되는 걸 막아주고 의존성 그래프에서 충돌을 예방하는 데 도움을 줍니다.

package(url:_:)

이 메서드는 버전 조건을 지정해서 원격 패키지 의존성을 추가합니다.

/// 버전 조건을 지정해서 원격 패키지 의존성을 추가합니다.
///
/// - Parameters:
///     - url: 패키지의 올바른 Git URL.
///     - requirement: 의존성 조건. `Package.Dependency.Requirement`의 정적 메서드를 참조하세요.
static func package(url: String, _ requirement: Package.Dependency.Requirement) -> Package.Dependency
swift

package(url:branch:)

이 메서드는 브랜치 조건을 지정해서 원격 패키지 의존성을 추가합니다.

/// 브랜치 조건을 지정해서 원격 패키지 의존성을 추가합니다.
///
///    .package(url: "<https://example.com/example-package.git>", branch: "main"),
///
/// - Parameters:
///     - url: 패키지의 올바른 Git URL.
///     - branch: 브랜치 조건.
static func package(url: String, branch: String) -> Package.Dependency
 
swift

package(url:revision:)

이 메서드는 리비전 조건을 지정해서 원격 패키지 의존성을 추가합니다.

/// 리비전 조건을 지정해서 원격 패키지 의존성을 추가합니다.
///
///    .package(url: "<https://example.com/example-package.git>", revision: "aa681bd6c61e22df0fd808044a886fc4a7ed3a65"),
///
/// - Parameters:
///     - url: 패키지의 올바른 Git URL.
///     - revision: 리비전 조건.
static func package(url: String, revision: String) -> Package.Dependency
swift

package(url:_:) (Range)

이 메서드는 특정 최소 버전에서 시작해서 정해진 최대 버전까지(포함하지 않음) 패키지 의존성을 추가합니다.

/// 특정 최소 버전에서 시작해서 정해진 최대 버전까지(포함하지 않음) 패키지 의존성을 추가합니다.
///
/// 다음 예제는 Swift 패키지 매니저가 `1.2.3`, `1.2.4`, `1.2.5`는 고를 수 있지만,
/// `1.2.6`은 고를 수 없어요.
///
///     .package(url: "<https://example.com/example-package.git>", "1.2.3"..<"1.2.6"),
///
/// - Parameters:
///     - url: 패키지의 올바른 Git URL.
///     - range: 사용자 지정 버전 범위 조건.
static func package(url: String, _ range: Range<Version>) -> Package.Dependency
 
swift

package(url:_:) (ClosedRange)

이 메서드는 특정 최소 버전에서 시작해서 특정 최대 버전까지(포함) 패키지 의존성을 추가합니다.

/// 특정 최소 버전에서 시작해서 특정 최대 버전까지(포함) 패키지 의존성을 추가합니다.
///
/// 다음 예제는 Swift 패키지 매니저가 `1.2.3`, `1.2.4`, `1.2.5`뿐만 아니라
/// `1.2.6`도 고를 수 있어요.
///
///     .package(url: "<https://example.com/example-package.git>", "1.2.3"..."1.2.6"),
///
/// - Parameters:
///     - url: 패키지의 올바른 Git URL.
///     - range: 닫힌 버전 범위 조건.
static func package(url: String, _ range: ClosedRange<Version>) -> Package.Dependency
swift

package(path:)

이 메서드는 파일 시스템의 로컬 패키지에 대한 의존성을 추가합니다.

/// 파일 시스템의 로컬 패키지에 대한 의존성을 추가합니다.
///
/// Swift 패키지 매니저는 패키지 의존성을 그대로 쓰고
/// 소스 제어 접근은 하지 않아요. 로컬 패키지 의존성은
/// 새로운 패키지를 개발하거나 여러 밀접하게 연결된 패키지로 작업할 때 특히 유용해요.
///
/// - Parameter path: 패키지의 경로.
static func package(path: String) -> Package.Dependency
swift

이렇게 여러 메서드로 Package.Dependency를 만들 수 있어요. 상황에 맞는 알맞은 메서드를 골라 쓰면 됩니다.

예를 들어, 다음과 같이 Package.swift 파일에서 의존성을 추가할 수 있어요.

let package = Package(
    name: "MyPackage",
    dependencies: [
        .package(url: "<https://github.com/apple/example-package-deckofplayingcards.git>", from: "3.0.0"),
        .package(url: "<https://github.com/apple/example-package-fisheryates.git>", "2.0.0"..<"3.0.0"),
        .package(url: "<https://github.com/apple/example-package-playingcard.git>", "1.0.0"..."1.5.0"),
    ],
    targets: [
        .target(
            name: "MyTarget",
            dependencies: ["DeckOfPlayingCards", "FisherYates", "PlayingCard"]),
    ]
)
swift

이 예제는 세 개의 패키지 의존성을 추가하고 있어요.

  1. example-package-deckofplayingcards는 버전 3.0.0 이상이 필요해요.
  2. example-package-fisheryates는 버전 2.0.0 이상, 3.0.0 미만이 필요해요.
  3. example-package-playingcard는 버전 1.0.0 이상, 1.5.0 이하가 필요해요.

그리고 MyTarget이라는 타깃이 이 세 패키지를 사용한다고 나와 있네요.

이렇게 Package.Dependency를 사용하면 패키지 사이의 의존 관계를 명확하게 정의할 수 있어요. 이를 통해 코드의 재사용성을 높이고 패키지 사이의 결합도를 낮출 수 있죠.

Swift 패키지 매니저의 강력한 기능 중 하나인 Package.Dependency를 잘 활용하면 더 효율적으로 패키지를 관리할 수 있어요!