🔥 Product

474자
6분

강의 목차

Swift Package Manager에서 Product는 외부에 노출되는 빌드 결과물을 정의하는 객체인데요. 이 Product는 패키지의 타깃 중 하나 이상의 빌드 결과물을 조합해서 만들어집니다.

Product에는 두 가지 타입이 있어요.

  1. Library. 라이브러리 타깃을 제공하려면 라이브러리 Product를 사용하세요. 이렇게 하면 타깃의 공개 API가 Swift 패키지를 통합하는 클라이언트에서 사용할 수 있게 됩니다.
  2. 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" 이라는 이름을 가진 Product
  • library 타입의 "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로 선언하면 클라이언트가 우리 패키지를 사용할 때 편리하게 접근할 수 있게 되는 거죠.