🔥 Product
474자
6분
강의 목차
Swift Package Manager에서 Product는 외부에 노출되는 빌드 결과물을 정의하는 객체인데요. 이 Product는 패키지의 타깃 중 하나 이상의 빌드 결과물을 조합해서 만들어집니다.
Product에는 두 가지 타입이 있어요.
- Library. 라이브러리 타깃을 제공하려면 라이브러리 Product를 사용하세요. 이렇게 하면 타깃의 공개 API가 Swift 패키지를 통합하는 클라이언트에서 사용할 수 있게 됩니다.
- Executable. 실행 파일 타깃을 제공하려면 실행 파일 Product를 사용하세요. 실행 파일을 클라이언트에게 제공하려는 경우에만 이 옵션을 사용하면 돼요.
아래 예제는 "Paper"라는 이름의 라이브러리에 대한 패키지 매니페스트를 보여주는데요. 여러 개의 Product를 정의하고 있죠.
let package = Package( name: "Paper", products: [ .executable(name: "tool", targets: ["tool"]), .library(name: "Paper", targets: ["Paper"]), .library(name: "PaperStatic", type: .static, targets: ["Paper"]), .library(name: "PaperDynamic", type: .dynamic, targets: ["Paper"]), ], dependencies: [ .package(url: "<http://example.com/ExamplePackage/ExamplePackage>", from: "1.2.3"), .package(url: "<http://some/other/lib>", .exact("1.2.3")), ], targets: [ .target( name: "tool", dependencies: [ "Paper", "ExamplePackage" ]), .target( name: "Paper", dependencies: [ "Basic", .target(name: "Utility"), .product(name: "AnotherExamplePackage"), ]) ] )swift
이 예제를 하나씩 살펴볼까요?
먼저 products 배열에는 4개의 Product가 선언되어 있네요.
executable타입의 "tool" 이라는 이름을 가진 Productlibrary타입의 "Paper", "PaperStatic", "PaperDynamic" 이라는 이름을 가진 Product
특히 라이브러리 타입의 Product 선언을 자세히 보면:
- "Paper"는 타입을 명시하지 않았어요. 이렇게 하면 Swift Package Manager가 라이브러리 사용자의 선호도에 따라 정적 또는 동적 링크를 선택할 수 있습니다. 가능하면 라이브러리 타입을 명시적으로 선언하지 않는 게 좋아요.
- "PaperStatic"은
.static타입으로 선언되었고, "PaperDynamic"은.dynamic타입으로 선언되었죠. 이렇게 특정 링크 타입을 지원하지 않는 경우 이렇게 명시적으로 선언할 수 있습니다.
그리고 targets를 보면 각 Product가 어떤 타깃들로 구성되는지 확인할 수 있어요.
이제 Product를 생성하는 메서드를 살펴볼까요?
Methods
/// 이 패키지에 의존성을 선언한 클라이언트가 패키지의 기능을 사용할 수 있도록 하려면 /// 라이브러리 Product를 생성하세요. /// /// 라이브러리 Product는 정적 또는 동적으로 링크될 수 있어요. /// 가능하면 라이브러리 타입을 명시적으로 선언하지 말고, /// Swift Package Manager가 패키지 사용자의 선호도에 따라 /// 정적 또는 동적 링크 중에서 선택하도록 하세요. (권장) /// /// - Parameters: /// - name: 라이브러리 Product의 이름이에요. /// - type: 라이브러리를 링크하는 방법을 결정하는데 사용되는 선택적 라이브러리 타입이에요. /// 이 매개변수를 지정하지 않으면 Swift Package Manager가 정적 또는 동적 링크 중에서 선택해요. (권장) /// 만약 두 가지 링크 타입을 모두 지원하지 않는다면, `.static` 또는 `.dynamic`을 사용하세요. /// - targets: 라이브러리 Product에 포함될 타깃들이에요. static func library(name: String, type: Product.Library.LibraryType? = nil, targets: [String]) -> Product /// 클라이언트가 실행할 수 있는 실행 파일 Product를 생성해요. /// /// - Parameters: /// - name: 실행 파일 Product의 이름이에요. /// - targets: 실행 파일 Product에 포함될 타깃들이에요. static func executable(name: String, targets: [String]) -> Productswift
library 메서드는 클라이언트가 이 패키지의 기능을 사용할 수 있도록 라이브러리 Product를 생성합니다. 주석에서 설명하듯이 가능하면 type 매개변수를 명시적으로 지정하지 말고, Swift Package Manager가 알아서 선택하도록 하는 게 좋아요.
executable 메서드는 클라이언트가 실행할 수 있는 실행 파일 Product를 생성하는 거예요.
이렇게 Product 클래스를 사용해서 우리 패키지가 외부에 제공할 빌드 결과물을 정의할 수 있답니다. 라이브러리든 실행 파일이든 Product로 선언하면 클라이언트가 우리 패키지를 사용할 때 편리하게 접근할 수 있게 되는 거죠.