일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Prod
- XCConfig
- Dependencies.swift
- 아키텍쳐
- Build Phase
- 모듈화
- Run Script
- Modular Architecture
- tuist 4
- Swift-Web
- Module
- Swift Package Manager
- Stencil
- 4.0.0
- Micro Feature
- Tuist 모듈화
- uFeature
- Tuist
- rethrows
- Swift
- ios
- Architecture
- SwiftLint
- swiftwasm
- SPM
- wasm
- SwifWeb
- dependencies
- 메모리 구조
- Publish
- Today
- Total
baegteun - iOS
Tuist 사용법 - 3. extension 본문
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 |