Tuist는 프로젝트와 워크스페이스를 정의하고 생성 프로세스를 구성하는데 기본적으로 Swift 파일을 사용합니다. 이러한 파일은 이 문서에서 매니페스트 파일이라고 합니다.
📌 “이 프로젝트는 어떤 Target, 어떤 설정을 가졌는가?“를 정의
name 프로퍼티에 지정된 이름으로 매니페스트 파일이 위치한 디렉토리에 생성됩니다.루트 변수
매니페스트의 루트에 있어야 하는 변수는
let project = Project(...)입니다. 매니페스트의 일부분을 코드에서 재사용 해야 된다면 Swift 함수를 사용할 수 있습니다.
📌 “이 루트는 Tuist 프로젝트다”를 Tuist에게 알려줌. 프로젝트 루트 결정
Tuist/ 디렉토리를 사용하여 프로젝트의 루트를 결정하고, 그 디렉토리에서 다른 매니페스트 파일을 찾습니다.Project.swift + Tuist.swift 두 개는 있어야 Tuist가 프로젝트로 인식할 수 있음!“프로젝트 루트 결정”이란?
Project.swift, Workspace.swift, Dependencies.swift 같은 매니페스트 파일들을 찾아간다. 👉 즉, Tuist.swift는 “여기가 Tuist 프로젝트의 뿌리다”라고 표시해주는 역할.📌 Xcode 워크스페이스를 나타냅니다.
Xcode Workspace는 말 그대로 여러 개의 Xcode 프로젝트(.xcodeproj)를 묶어서 한 번에 관리할 수 있는 컨테이너
🔹 파일 구조 예시
MyWorkspace.xcworkspace <- 워크스페이스
App/App.xcodeproj <- 앱 프로젝트
MyFramework/MyFramework.xcodeproj <- 프레임워크 프로젝트
Xcode에서 MyWorkspace.xcworkspace를 열면 → App + MyFramework 프로젝트가 한 창에서 같이 보임.
Tuist에서는 .xcworkspace를 직접 안 만들고, Workspace.swift라는 매니페스트 파일에 이렇게 정의한다.
import ProjectDescription
let workspace = Workspace(
name: "MyWorkspace",
projects: [
"App",
"MyFramework"
]
)
그 다음 tuist generate 하면 자동으로 MyWorkspace.xcworkspace가 생기고, Xcode에서 열 수 있음.
Tuist로 모듈을 나눠서 관리하려면 각 모듈을 프레임워크(Target) 으로 만들고, Workspace에서 묶어주면 된다.
📌 Tuist가 구성 가능하고 최적화할 수 있는 Xcode 프로젝트와 타겟을 사용하여 통합하기 위한 Swift Package 의존성을 포함
👉 그래서 Finder에서 보이는 건 내가 만든 게 아니라 Tuist가 생성한 빌드 산출물
만약 직접 커스텀 Info.plist를 쓰고 싶다면 Target 정의에서:
.infoPlist(.file(path: "Support/Info.plist"))
// 현재 내 프로젝트는 infoPlist: .default 이렇게 설정 되어있음
이렇게 명시해야 한다.
Tuist에서 “모듈”이라고 하면 보통 Framework (라이브러리) 같은 독립적인 Target을 말한다.
Tuist에서 Target을 만들 때 product를 지정. 그게 어떤 산출물을 빌드할지 결정하는 거임!
.app → 실행 가능한 앱 (iOS/macOS/tvOS 등).framework → 다른 모듈에서 가져다 쓸 수 있는 동적 프레임워크.staticFramework → 정적으로 링크되는 프레임워크 (용량 최적화, 배포 특화).library → 코드 묶음. .static / .dynamic 옵션 가능.unitTests → 단위 테스트 타겟.uiTests → UI 테스트 타겟.bundle → 리소스 묶음 (예: 이미지, JSON, 폰트).commandLineTool → 실행 가능한 CLI 툴👉 App은 보통 .app, Feature/Core/UI는 .framework 또는 .staticFramework로 많이 만든다.
Tuist에서 staticFramework는 빌드 타임에 코드가 병합돼서 모듈 임포트가 잘 되는데,
framework는 런타임에 로딩되는 형태