🔥 Package 클래스
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
라이브러리의 새로운 버전을 사용하면서도, 기존 패키지의 호환성을 유지할 수 있습니다. 따라서 패키지 매니페스트를 업데이트하더라도 기존 패키지를 계속 사용할 수 있습니다.