🔥 Target Dependency

406자
5분

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

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

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

swift
/// 같은 패키지 안에 있는 타겟에 의존성을 만듭니다.
///
/// - parameters:
///   - name: 타겟의 이름이에요.
///   - condition: 타겟 의존성이 적용되는 조건이에요. 예를 들어, 특정 플랫폼에서만 의존성을 적용할 수 있죠.
static func target(
    name: String,
    condition: TargetDependencyCondition? = nil
) -> Target.Dependency
swift
/// 같은 패키지 안에 있는 타겟에 의존성을 만듭니다.
///
/// - 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
let package = Package(
    name: "MyPackage",
    targets: [
        .target(
            name: "MyTarget",
            dependencies: [
                .target(name: "AnotherTarget")
            ]
        ),
        .target(
            name: "AnotherTarget"
        )
    ]
)

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

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

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

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

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

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

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

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

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

swift
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
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")
            ]
        )
    ]
)

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

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

YouTube 영상

채널 보기
스칼라 곱셈과 내적의 기하학적 의미 | 선형대수학
Trie 자료구조 완전 정복 - 개념부터 시각화까지 | Trie 자료구조 이야기
숫자 하나가 AI 모델의 운명을 바꾼다? | 선형대수학
우리가 매일 쓰는 맞춤법 검사기와 라우터 속에 숨겨진 알고리즘은? | Trie 자료구조 이야기
AI를 위한 선형대수학 - 소개 | 선형대수학
BTree 노드의 구조는?
트라이(Trie) 자료구조: 파이썬으로 삽입(Insert) 연산 구현하기 | Trie 자료구조 이야기
7편, 파이썬으로 구현하는 B-Tree