1. Tuist 설치
Tuist는 이제 brew말고 mise로 설치하기를 권장한다.
brew로 mise를 설치하고 mise로 Tuist를 설치해주었더니 @4.55.6 이 설치되었다.
// brew: 다양한 개발 툴과 소프트웨어를 쉽게 설치/관리하는 패키지 매니저
brew install mise
// mise: 여러 프로그래밍 언어와 런타임의 버전을 프로젝트별로 관리하는 버전 매니저
mise install tuist
2. 기존 프로젝트에 Tuist 초기화
프로젝트의 루트 폴더에서 tuist init을 입력하면, 기존 프로젝트에 통합 할 것인지 새로 프로젝트를 만들 것 인지 묻는다.
// tuist로 초기화
tuist init
나는 기존 프로젝트에 적용할 것 이므로 Integrate with [프로젝트명]을 선택해주었다.

Would you like use server features (e.g. selective testing, previews)? 라고 나오는데
Tuist에서 제공하는 원격서버의 기능을 쓸 것인지 묻는 것이기 때문에 No를 택해주었다.
나는 기존 프로젝트에 Tuist를 적용했기 때문에 Project.swift 직접 만들어주었다.
Project.swift?
Project.swift는 Xcode 프로젝트 설계(번들 ID, Info.plist, 타겟 등등)과 패키지, 외부 라이브러리 의존성 관리, 빌드 설정 등을 Swift 코드로 할 수 있게 한다. 우리가 협업시에는 원격저장소에서 이 파일을 받아오고 tuist generate 명령어를 통해 실제 Xcode 프로젝트 파일(.xcodeproj)을 만들어준다.
import ProjectDescription
let project = Project(
name: "RunLog",
organizationName: "ESTSOFTiOSTEAM1",
targets: [
.target(
name: "RunLog",
destinations: [.iPhone],
product: .app,
bundleId: BUNDLE_ID,
deploymentTargets: .iOS("17.0"),
infoPlist: .file(path: "RunLog/InfoPlists/RunLog-info.plist"),
sources: ["RunLog/Sources/**"],
resources: ["RunLog/Resources/**"],
dependencies: [
.external(name: "SnapKit"),
.external(name: "Then"),
.external(name: "Moya"),
.external(name: "NVActivityIndicatorView"),
],
coreDataModels: [
.coreDataModel("RunLog/Sources/Data/DTO/DTOs.xcdatamodeld")
]
),
.target(
name: "RpTest",
destinations: [.iPhone],
product: .unitTests,
bundleId: BUNDLE_ID,
deploymentTargets: .iOS("17.0"),
infoPlist: .file(path: "RpTest/InfoPlists/RpTest-info.plist"),
sources: ["RpTest/Sources/**"],
dependencies: [
.target(name: "RunLog")
]
)
]
)
- infoPlist: infoPlist의 파일 위치
- sources: Swift 코드가 있는 공간
- resources: Font, Asset 등이 있는 공간(.swift 이외 파일들)
- dependencies: 외부 모듈이나 패키지에 대한 의존성 명시
- coreDataModels: CoreData Entity를 명시하는 xcdatamodeld파일 위치
다음은 내가 위에서 사용하는 패키지들의 의존성을 Package.swift에 명시해야한다.
Package.swift?
SPM(Swift Package Manager)기반의 모듈 관리이다.
이전에 Dependencies.swift에서 하던 방식이 deprecated되고 Package로 바뀌었다.
tuist edit
상단 명령어를 쳐주면 Manifests가 열리면서 Tuist 구성 파일들이 보여진다.

왼쪽 네비게이터 처럼 해당 파일 위치에 Package.swift를 만들어주고,
아래와 같이 기존 프로젝트에서 쓰고 있는 패키지들을 넣어주었다.
// swift-tools-version: 6.0
import PackageDescription
#if TUIST
import struct ProjectDescription.PackageSettings
let packageSettings = PackageSettings(
// Customize the product types for specific package product
// Default is .staticFramework
// productTypes: ["Alamofire": .framework,]
productTypes: [:]
)
#endif
let package = Package(
name: "RunLogPackages",
dependencies: [
.package(url: "https://github.com/SnapKit/SnapKit", from: "5.7.1"),
.package(url: "https://github.com/devxoul/Then", from: "3.0.0"),
.package(url: "https://github.com/Moya/Moya.git", from: "15.0.3"),
.package(url: "https://github.com/ninjaprox/NVActivityIndicatorView", from: "5.2.0")
]
)
tuist install을 하면 위 dependencies에 나열한 그대로 패키지를 가져와 준 후 generate를 하면
Project.swift에 명시한대로 Xcode 프로젝트를 만들어준다.
tuist install
tuist generate
// 패키지 종속성에 문제가 생길 시
rm -rf ~/Library/Developer/Xcode/DerivedData
tuist clean
// 이후 다시 install
tuist install
generate 이후 켜진 Xcode로 실행을 해보면 잘 돌아가는 것을 확인 할 수 있다.

이렇게 하면 기본적인 Tuist 셋팅은 끝났다.
하다보니 길어져서 아예 새로운 포스팅으로 다음 내용을 담아보았다.
[iOS] 기존 프로젝트에 Tuist v4 적용하기(2/2)
1. 모듈화 계획이전 포스팅에서 기존 프로젝트에 Tuist를 적용하기 위해 기본 세팅까지 마무리를 했고,이번에는 레이어 별로 모듈화를 진행하려고 한다. [iOS] 기존 프로젝트에 Tuist v4 적용하기(1/2)
slaveshin.tistory.com
댓글