🔥 Target Dependency

406자
5분

Swift 패키지에서 타겟들이 서로 어떻게 의존하는지 정의하는 방법에 대해 알아보겠습니다. Target.Dependency 클래스는 타겟이 다른 것들과 의존 관계를 가질 때 사용하는 여러 가지 유형을 나타내요.

같은 패키지 안에 있는 타겟에 의존하기

target(name:condition:) 메서드를 쓰면 같은 패키지 안에 있는 다른 타겟에 의존하도록 만들 수 있어요.

/// 같은 패키지 안에 있는 타겟에 의존성을 만듭니다.
///
/// - parameters:
///   - name: 타겟의 이름이에요.
///   - condition: 타겟 의존성이 적용되는 조건이에요. 예를 들어, 특정 플랫폼에서만 의존성을 적용할 수 있죠.
static func target(
    name: String,
    condition: TargetDependencyCondition? = nil
) -> Target.Dependency
swift

예를 들면 이렇게 쓸 수 있겠네요:

let package = Package(
    name: "MyPackage",
    targets: [
        .target(
            name: "MyTarget",
            dependencies: [
                .target(name: "AnotherTarget")
            ]
        ),
        .target(
            name: "AnotherTarget"
        )
    ]
)
swift

위 예시에서 MyTarget은 같은 패키지 안에 있는 AnotherTarget에 의존해요.

패키지 의존성의 제품에 타겟 의존하기

product(name:package:condition:) 메서드를 쓰면 패키지 의존성의 제품에 타겟이 의존하도록 만들 수 있어요.

/// 패키지 의존성의 제품에 타겟 의존성을 만듭니다.
///
/// - parameters:
///   - name: 제품의 이름이에요.
///   - package: 패키지의 이름이에요.
///   - condition: 타겟 의존성이 적용되는 조건이에요. 예를 들어, 특정 플랫폼에서만 의존성을 적용할 수 있죠.
static func product(
    name: String,
    package: String,
    condition: TargetDependencyCondition? = nil
) -> Target.Dependency
swift

이 메서드는 이렇게 쓸 수 있어요:

let package = Package(
    name: "MyPackage",
    dependencies: [
        .package(url: "<https://github.com/Alamofire/Alamofire.git>", from: "5.5.0")
    ],
    targets: [
        .target(
            name: "MyTarget",
            dependencies: [
                .product(name: "Alamofire", package: "Alamofire")
            ]
        )
    ]
)
swift

위 예시에서 MyTargetAlamofire 패키지의 Alamofire 제품에 의존하고 있네요.

이름으로 타겟이나 제품에 의존하기

byName(name:condition:) 메서드를 쓰면 Swift 패키지 매니저가 패키지 그래프를 불러온 뒤에 타겟이나 제품으로 해석되는 이름으로 의존성을 만들 수 있어요.

/// Swift 패키지 매니저가 패키지 그래프를 불러온 뒤에 타겟이나 제품으로 해석되는 의존성을 이름으로 만듭니다.
///
/// - parameters:
///   - name: 타겟이나 제품의 이름이에요.
///   - condition: 타겟 의존성이 적용되는 조건이에요. 예를 들어, 특정 플랫폼에서만 의존성을 적용할 수 있죠.
static func byName(
    name: String
    condition: TargetDependencyCondition? = nil
) -> Target.Dependency
swift

byName 메서드는 이렇게 쓸 수 있어요:

let package = Package(
    name: "MyPackage",
    dependencies: [
        .package(url: "<https://github.com/Alamofire/Alamofire.git>", from: "5.5.0")
    ],
    targets: [
        .target(
            name: "MyTarget",
            dependencies: [
                .byName(name: "Alamofire")
            ]
        )
    ]
)
swift

위 예시에서 MyTargetAlamofire라는 이름의 의존성을 가지는데, 이건 타겟이나 제품으로 해석될 수 있어요.

이렇게 Target.Dependency 클래스를 사용해서 Swift 패키지 안에서 타겟들 사이의 의존성을 정의할 수 있어요. 같은 패키지 안의 타겟, 패키지 의존성의 제품, 또는 이름으로 해석되는 타겟이나 제품에 의존하도록 만들 수 있죠. 이렇게 하면 코드를 잘 나누고 재사용할 수 있습니다.