Tuist에 처음 접하시는 분들은 아래 두 포스팅을 보고 오시면 도움이 됩니다!
https://cheonsong.tistory.com/14
https://cheonsong.tistory.com/15
저번 포스팅에서는 클린아키텍쳐를 기반으로 프로젝트를 모듈화 하는 작업을 했습니다. 이번 포스팅에서는 SPM, Cocoapods을 통해 외부 라이브러리를 가져오는 방법을 소개하겠습니다.
SPM ( Swift Package Manager )
패키지 가져오기
외부라이브러리 URL을 통해 패키지를 가져오는 과정입니다.
public extension Package {
static let rxSwift: Package = .remote(url: "https://github.com/ReactiveX/RxSwift", requirement: .branch("main"))
static let snapKit: Package = .remote(url: "https://github.com/SnapKit/SnapKit", requirement: .upToNextMinor(from: "5.0.1"))
static let then: Package = .remote(url: "https://github.com/devxoul/Then", requirement: .upToNextMajor(from: "2.7.0"))
}
ProjectDescriptionHelpers 폴더와 같은 계층에 Dependencies라는 파일을 생성 후 위 코드를 추가해주세요.
Package Extension 을 통해 패키지를 불러올 경로를 설정합니다.
requirement에 어느 시점의 소스를 가져올지 지정할 수 있습니다. branch명, 메이저 버전, 마이너 버전 등
패키지 다운받기
let dependencies = Dependencies(
carthage: [],
swiftPackageManager: [
.rxSwift,
.snapKit,
.then
],
platforms: [.iOS]
)
Dependencies파일 안에 추가로 작성해주세요.
그 후 swiftPackageManager에 불러온 패키지를 추가해주고 다운로드합니다.
TargetDependency 추가
SPM을 통해 패키지를 다운로드하였고 이제 원하는 프로젝트에 적용해야 합니다. 의존성을 주입하기 위해선 TargetDependency타입으로 주입해야 합니다.
public extension TargetDependency {
static let rxSwift: TargetDependency = .external(name: "RxSwift")
static let snapKit: TargetDependency = .external(name: "SnapKit")
static let then: TargetDependency = .external(name: "Then")
}
PreojectDescriptionHelpers 폴더 안에 해당 소스코드 파일을 추가합니다. 라이브러리 이름을. external(name: ~)으로 추가합니다.
프로젝트에 의존성 주입
의존성을 주입하고자 하는 프로젝트 파일의 Project.swift파일을 열어줍니다. 그리고 dependencies 매개변수에 의존성을 주입합니다.
let project = Project.framework(name: Module.presentation.name,
dependencies: [.rxSwift, .snapKit, .then],
resources: .default)
Fetch - Generate
SPM을 통해 의존성을 생성한 경우 tuist generate를 하시면 안 되고 tuist fetch & tuist generate 명령어를 실행해주셔야 정상적으로 추가한 라이브러리가 적용됩니다. 혹시 제대로 라이브러리가 적용되지 않을 경우 tuist clean 이후 다시 시도하시면 됩니다.
정상적으로 다운이 됐다면 프로젝트의 Tuist폴더에 가보시면 이 처럼 다운로드한 라이브러리가 프로젝트로 들어가 있습니다.
Cocoapods
Podfile추가
Tuist가 3.x로 넘어오면서 더 이상 cocoapods을 지원하지 않습니다. 그래서 저희는 별도 podfile을 작성하고 pod을 적용시켜야 합니다.
Workspace가 존재하는 계층에서 touch Podfile 명령어를 통해 Podfile을 생성해주세요
cd <project path>
touch Podfile
그 후 프로젝트에 생성된 Podfile을 열어 해당 코드를 추가해줍니다.
# Uncomment the next line to define a global platform for your project
platform :ios, '13.0'
use_frameworks!
inhibit_all_warnings!
workspace 'Project.xcworkspace'
project 'Project/App/App.xcodeproj'
project 'Project/Domain/Domain.xcodeproj'
project 'Project/DesignSystem/DesignSystem.xcodeproj'
project 'Project/Presentation/Presentation.xcodeproj'
project 'Project/Data/Data.xcodeproj'
target 'App' do
project 'Project/App/App.xcodeproj'
end
target 'Domain' do
project 'Project/Domain/Domain.xcodeproj'
end
target 'Design' do
project 'Project/DesignSystem/DesignSystem.xcodeproj'
end
target 'Presentation' do
project 'Project/Presentation/Presentation.xcodeproj'
end
target 'Data' do
project 'Project/Data/Data.xcodeproj'
end
프로젝트 이름, 워크스페이스 이름, 경로는 자신의 프로젝트에 맞게 수정하시면 됩니다.
저는 다섯 개의 모듈화 된 프로젝트를 하나의 워크스페이스로 묶었기 때문에 workspace이름과 각각의 프로젝트 이름을 지정해줍니다.
또한 Pod을 다운로드할 target을 각각 프로젝트마다 지정해주고 추가하고 싶은 라이브러리를 원하는 프로젝트의 작성해주시면 됩니다.
Generate
Podfiled을 작성했다면 tuist generate 이후 pod install을 하시면 됩니다.
저는 tuist clean, tuist fetch, tuist generate, pod install을 차례대로 실행하도록 Makefile을 하나 만들어 make project라는 명령어로 모든 과정을 한 번에 수행해 프로젝트를 생성하도록 작업했습니다.
project:
tuist clean
tuist fetch
tuist generate --no-open && pod install && open Project.xcworkspace
open:
tuist generate --no-open && pod install && open Project.xcworkspace
asset:
tuist generate
pod install
마치며
이번 시간에는 외부에서 의존성을 가져와 주입하는 과정에 대해 포스팅했습니다. carthago도 가능한데 저는 사용하지 않아서 따로 다루지는 않았습니다.
해당 코드는 제 깃허브에 공개돼있습니다.
https://github.com/cheonsong/TuistTemplete
'iOS' 카테고리의 다른 글
[iOS] Google Sheets와 Script로 현지화 자동화하기 (0) | 2022.12.27 |
---|---|
[iOS] iOS프로젝트에 Script 설정하기 (with Tuist) (0) | 2022.12.21 |
[iOS] 프로젝트 모듈화 하기 - Tuist (2/4) (1) | 2022.11.04 |
[iOS] 프로젝트 생성 및 관리 - Tuist (1/4) (1) | 2022.09.30 |
[iOS] Gradient Layer 적용 시 View가 잘리는 현상 (0) | 2022.02.04 |