🔥 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]) -> Product
swift
library
메서드는 클라이언트가 이 패키지의 기능을 사용할 수 있도록 라이브러리 Product를 생성합니다. 주석에서 설명하듯이 가능하면 type
매개변수를 명시적으로 지정하지 말고, Swift Package Manager가 알아서 선택하도록 하는 게 좋아요.
executable
메서드는 클라이언트가 실행할 수 있는 실행 파일 Product를 생성하는 거예요.
이렇게 Product 클래스를 사용해서 우리 패키지가 외부에 제공할 빌드 결과물을 정의할 수 있답니다. 라이브러리든 실행 파일이든 Product로 선언하면 클라이언트가 우리 패키지를 사용할 때 편리하게 접근할 수 있게 되는 거죠.