🔥 Package 클래스

379자
5분

Swift Package Manager는 Swift 코드의 배포를 관리하기 위해 만들어진 도구이지요. 이 도구의 핵심에는 Package 클래스가 있답니다. Package 클래스는 Swift 패키지의 구성을 나타내는 클래스라고 할 수 있어요.

Package 클래스의 초기화 메서드에 여러 가지 매개변수를 전달하여 패키지의 이름, 대상, 제품, 의존성 및 기타 구성 옵션을 제공할 수 있지요. 보통은 Package 클래스의 속성을 중첩된 초기화 구문에 정의하고, 초기화 후에는 수정하지 않는 것이 관례랍니다.

아래 코드는 MyLibrary라는 Swift 패키지에 대한 간단한 패키지 객체를 초기화하는 과정을 보여주고 있어요.

// swift-tools-version:5.1
import PackageDescription
 
let package = Package(
    name: "MyLibrary",  // 패키지의 이름을 설정합니다.
    platforms: [
        .macOS(.v10_15) // 지원할 플랫폼과 최소 버전을 설정합니다.
    ],
    products: [
        // 패키지가 생성할 라이브러리 제품을 설정합니다.
        .library(name: "MyLibrary", targets: ["MyLibrary"]),
    ],
    dependencies: [
        // 패키지가 의존하는 다른 패키지를 설정합니다.
        .package(url: "<https://url/of/another/package/named/Utility>", from: "1.0.0"),
    ],
    targets: [
        // 라이브러리 타겟과 테스트 타겟을 설정합니다.
        .target(name: "MyLibrary", dependencies: ["Utility"]),
        .testTarget(name: "MyLibraryTests", dependencies: ["MyLibrary"]),
    ]
)
swift

이처럼 Package 클래스의 초기화 메서드에는 다양한 매개변수를 전달할 수 있답니다. 각 매개변수의 의미를 좀 더 자세히 살펴볼까요?

  • name: 패키지의 이름을 나타내는 문자열이에요. 필수 매개변수죠.
  • defaultLocalization: 패키지의 기본 지역화 설정을 나타내는 LanguageTag 배열이에요. 옵셔널 매개변수랍니다.
  • platforms: 패키지가 지원하는 플랫폼과 최소 버전을 나타내는 SupportedPlatform 배열이에요. 옵셔널 매개변수죠.
  • products: 패키지가 생성할 제품을 나타내는 Product 배열이에요.
  • dependencies: 패키지가 의존하는 다른 패키지를 나타내는 Package.Dependency 배열이에요.
  • targets: 패키지가 빌드할 대상을 나타내는 Target 배열이에요.
  • swiftLanguageVersions: Swift 언어의 버전 요구사항을 나타내는 SwiftVersion 배열이에요. 옵셔널 매개변수랍니다.
  • cLanguageStandard: C 언어 표준을 나타내는 CLanguageStandard에요. 옵셔널 매개변수죠.
  • cxxLanguageStandard: C++ 언어 표준을 나타내는 CXXLanguageStandard에요. 옵셔널 매개변수랍니다.

이렇게 다양한 매개변수를 조합하여 패키지의 구성을 유연하게 정의할 수 있답니다. 참 간단하고 명확하죠?

그런데 Package.swift 매니페스트 파일의 가장 첫 줄에는 항상 // swift-tools-version: 다음에 버전 번호 지정자가 와야 한다는 사실, 알고 계셨나요?

// swift-tools-version:3.0.2
// swift-tools-version:3.1
// swift-tools-version:4.0
// swift-tools-version:5.0
// swift-tools-version:5.1
// swift-tools-version:5.2
// swift-tools-version:5.3
swift

이 Swift 도구 버전은 PackageDescription 라이브러리의 버전, 매니페스트를 처리하기 위한 Swift 도구 및 Swift 언어 호환성 버전의 최소 버전, 그리고 Swift 패키지를 사용하는 데 필요한 Swift 도구의 최소 버전을 선언한답니다.

Swift의 새로운 버전이 출시되면, PackageDescription 프레임워크에 새로운 기능이 추가될 수 있습니다. 하지만 이전 버전의 Swift 도구를 사용하는 패키지는 계속해서 이전 버전의 API를 사용할 수 있습니다. 이런 방식 덕분에 Swift 언어, Swift 도구(swift-tools), 그리고 PackageDescription 라이브러리의 새로운 버전을 사용하면서도, 기존 패키지의 호환성을 유지할 수 있습니다. 따라서 패키지 매니페스트를 업데이트하더라도 기존 패키지를 계속 사용할 수 있습니다.