Tuist Manifest

술술·2025년 8월 29일

Tuist Manifest

각 파일의 역할

Tuist는 프로젝트와 워크스페이스를 정의하고 생성 프로세스를 구성하는데 기본적으로 Swift 파일을 사용합니다. 이러한 파일은 이 문서에서 매니페스트 파일이라고 합니다.

Project.swift

📌 “이 프로젝트는 어떤 Target, 어떤 설정을 가졌는가?“를 정의

  • 프로젝트별(모듈별) 설정 파일
  • Xcode 프로젝트를 선언하는 파일
  • 프로젝트는 name 프로퍼티에 지정된 이름으로 매니페스트 파일이 위치한 디렉토리에 생성됩니다.
  • 프로젝트의 타겟과 의존성을 정의합니다.

루트 변수

매니페스트의 루트에 있어야 하는 변수는 let project = Project(...) 입니다. 매니페스트의 일부분을 코드에서 재사용 해야 된다면 Swift 함수를 사용할 수 있습니다.

Tuist.swift

📌 “이 루트는 Tuist 프로젝트다”를 Tuist에게 알려줌. 프로젝트 루트 결정

  • Tuist 구성과 프로젝트의 루트 디렉토리를 결정
  • Tuist는 Tuist/ 디렉토리를 사용하여 프로젝트의 루트를 결정하고, 그 디렉토리에서 다른 매니페스트 파일을 찾습니다.
  • 즉, 최소한 Project.swift + Tuist.swift 두 개는 있어야 Tuist가 프로젝트로 인식할 수 있음!

“프로젝트 루트 결정”이란?

  • Tuist는 어디서부터 프로젝트의 기준점(root directory)을 잡아야 하는지를 알아야 한다.
  • 예를 들어, tuist generate를 실행했을 때 어떤 디렉토리를 기준으로 프로젝트 파일들을 읽고 Xcode 프로젝트를 만들어낼지 정하는 것.
  • Tuist.swift가 있는 곳이 루트가 되고, 여기서부터 Project.swift, Workspace.swift, Dependencies.swift 같은 매니페스트 파일들을 찾아간다. 👉 즉, Tuist.swift는 “여기가 Tuist 프로젝트의 뿌리다”라고 표시해주는 역할.

Workspace.swift

📌 Xcode 워크스페이스를 나타냅니다.

  • 다른 프로젝트를 그룹화 하고 파일과 스킴을 추가할 수도 있다.

Xcode Workspace

Xcode Workspace는 말 그대로 여러 개의 Xcode 프로젝트(.xcodeproj)를 묶어서 한 번에 관리할 수 있는 컨테이너

  • Xcode 프로젝트(.xcodeproj) = 하나의 앱, 프레임워크, 라이브러리 같은 단일 빌드 단위
  • Xcode 워크스페이스(.xcworkspace) = 여러 프로젝트를 한 바구니에 담아서 같이 여는 “폴더” 같은 개념

🔹 파일 구조 예시

MyWorkspace.xcworkspace   <- 워크스페이스
App/App.xcodeproj         <- 앱 프로젝트
MyFramework/MyFramework.xcodeproj <- 프레임워크 프로젝트

Xcode에서 MyWorkspace.xcworkspace를 열면 → App + MyFramework 프로젝트가 한 창에서 같이 보임.


Tuist와 Workspace

Tuist에서는 .xcworkspace를 직접 안 만들고, Workspace.swift라는 매니페스트 파일에 이렇게 정의한다.

import ProjectDescription

let workspace = Workspace(
    name: "MyWorkspace",
    projects: [
        "App",
        "MyFramework"
    ]
)

그 다음 tuist generate 하면 자동으로 MyWorkspace.xcworkspace가 생기고, Xcode에서 열 수 있음.

Tuist로 모듈을 나눠서 관리하려면 각 모듈을 프레임워크(Target) 으로 만들고, Workspace에서 묶어주면 된다.


Package.swift

📌 Tuist가 구성 가능하고 최적화할 수 있는 Xcode 프로젝트와 타겟을 사용하여 통합하기 위한 Swift Package 의존성을 포함



Derived

Derived 폴더에 생긴 Info.plist

  • Tuist는 매니페스트에서 따로 Info.plist를 지정하지 않으면, 기본 Info.plist를 자동으로 만들어 넣어준다.
  • 즉, “앱이 빌드되려면 Info.plist가 필요한데 네가 안 줬으니, 내가 임시로 하나 만들어줄게” 하는 거.

👉 그래서 Finder에서 보이는 건 내가 만든 게 아니라 Tuist가 생성한 빌드 산출물

만약 직접 커스텀 Info.plist를 쓰고 싶다면 Target 정의에서:

.infoPlist(.file(path: "Support/Info.plist"))

// 현재 내 프로젝트는 infoPlist: .default 이렇게 설정 되어있음

이렇게 명시해야 한다.


Tuist Product

Tuist에서 “모듈”이라고 하면 보통 Framework (라이브러리) 같은 독립적인 Target을 말한다.

product의 종류와 설명

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런타임에 로딩되는 형태

profile
Hello

0개의 댓글