baegteun - iOS

Tuist 사용법 - 3. extension 본문

Tuist

Tuist 사용법 - 3. extension

baegteun 2022. 8. 19. 13:56

Tuist에서 프로젝트를 만들때, dependencies에 다른 프로젝트 또는 라이브러리같은 의존성을 추가할 수 있습니다. 이때 TargetDependency이나 Package의 extension으로 다른 프로젝트같은 의존성을 추가해놓으면 쉽게 관리할 수 있습니다.

(1편의 샘플 프로젝트에서 이어집니다.)

프로젝트

tuist edit

으로 edit을 열어줍니다.

Tuist/ProjectDescriptionHelpers Group아래에 Dependency+Project.swift 파일을 만듭니다. 여기에는 프로젝트들을 extension에 추가해놓을 겁니다.

// Dependency+Project.swift

import ProjectDescription

extension TargetDependency {
    public enum Projcet {}
}

public extension TargetDependency.Projcet {
    static let Feature = TargetDependency.project(target: "Feature", path: .relativeToRoot("Projects/Feature"))
    static let Service = TargetDependency.project(target: "Service", path: .relativeToRoot("Projects/Service"))
    static let ThirdPartyLib = TargetDependency.project(target: "ThirdPartyLib", path: .relativeToRoot("Projects/ThirdPartyLib"))
}

App은 가장 상위의 모듈이니 App 모듈을 의존성으로 갖는 모듈은 없을거라 따로 만들어주지는 않습니다.

이렇게 작성해주고 끈다음 다시 터미널에

tuist edit

으로 다시 열어줍니다.

그 다음에 Projects/App 아래의 Project.swift 파일에서

    dependencies: [
        .project(target: "Featrue", path: .relativeToRoot("Projects/Feature"))
    ],

이렇게 되어있는 부분을

    dependencies: [
        .Projcet.Feature
    ],

이렇게 바꿔줄 수 있습니다.

외부 라이브러리

SPM이나 Carthage, Framework를 위한 extension을 만들어보겠습니다.

Tuist/ProjectDescriptionHelpers Group아래에 Dependency+SPM.swift, Dependency+Carthage.swift, Dependency+Framework.swift 를 각각 만들어주겠습니다.

Dependency+SPM

SPM의 경우 Xcode native SPM이랑 Tuist의 SPM이랑 조금 다르다보니 extension의 내용도 차이가 조금 있습니다.
Dependency+Spm.swift파일에서 Xcode native SPM를 사용한다면 아래와 같이,

import ProjectDescription

public extension TargetDependency {
    enum SPM {}
}

public extension Package {
    static let Rx = Package.remote(url: "https://github.com/ReactiveX/RxSwift.git", requirement: .upToNextMajor(from: "6.5.0"))
}

public extension TargetDependency.SPM {
    static let RxSwift = TargetDependency.package(product: "RxSwift")
    static let RxCocoa = TargetDependency.package(product: "RxCocoa")
    static let RxRelay = TargetDependency.package(product: "RxRelay")
}

Tuist의 SPM은 아래처럼 할 수 있습니다.

import ProjectDescription

public extension TargetDependency {
    enum SPM {}
}

public extension TargetDependency.SPM {
    static let RxSwift = TargetDependency.external(name: "RxSwift")
    static let RxCocoa = TargetDependency.external(name: "RxCocoa")
    static let RxRelay = TargetDependency.external(name: "RxRelay")
}

실제 사용할 때는
Xcode native SPM의 경우 아래처럼,

import ProjectDescription
import ProjectDescriptionHelpers

let project = Project.makeModule(
    name: "ThirdPartyLib",
    product: .framework,
    packages: [
        .Rx
    ],
    dependencies: [
        .SPM.RxSwift,
        .SPM.RxCocoa,
        .SPM.RxRelay
    ]
)

Tuist의 SPM은 아래처럼 사용할 수 있습니다. 프로젝트에 사용할 때는 Package에 넣는지 정도가 차이입니다.

import ProjectDescription
import ProjectDescriptionHelpers

let project = Project.makeModule(
    name: "ThirdPartyLib",
    product: .framework,
    packages: [],
    dependencies: [
        .SPM.RxSwift,
        .SPM.RxCocoa,
        .SPM.RxRelay
    ]
)

Dependency+Carthage

Tuist의 Carthage를 사용합니다.
Dependency+Carthage.swift파일에서 아래와 같이 작성합니다.

import ProjectDescription

public extension TargetDependency {
    enum Carthage {}
}

public extension TargetDependency.Carthage {
    static let RxSwift = TargetDependency.external(name: "RxSwift")
}

사실 Tuist의 SPM을 쓰는것과 별 차이는 없습니다.

import ProjectDescription
import ProjectDescriptionHelpers

let project = Project.makeModule(
    name: "ThirdPartyLib",
    product: .framework,
    packages: [],
    dependencies: [
        .Carthage.RxSwift
    ]
)

사용할때도 위와같이 사용하면 됩니다.

Dependency+Framework

Framework를 쓰는 방법입니다.

import ProjectDescription

public extension TargetDependency {
    enum Framework {}
}

public extension TargetDependency.Framework {
    static let RxSwift = TargetDependency.framework(path: "Framework/RxSwift.framework")
}

.Framework로 가져와서 쓰면 됩니다.

import ProjectDescription
import ProjectDescriptionHelpers

let project = Project.makeModule(
    name: "ThirdPartyLib",
    product: .framework,
    packages: [],
    dependencies: [
        .Framework.RxSwift
    ]
)

Reference By

https://github.com/mephrine/TuistRxTemplate
http://minsone.github.io/mac/ios/ios-project-generate-with-tuist-3

'Tuist' 카테고리의 다른 글

Tuist 사용법 - 6. 버전 고정  (0) 2022.09.19
Tuist 사용법 - 5. Plugin  (0) 2022.08.28
Tuist 사용법 - 4. Script  (5) 2022.08.20
Tuist 사용법 - 2. 외부 의존성  (0) 2022.08.17
Tuist 사용법 - 1. 이론 및 샘플 예제  (9) 2022.08.15
Comments