Tuist 란?
Tuist는 iOS 및 macOS 애플리케이션 개발에서 프로젝트 구성 및 빌드를 자동화하고 효율적으로 관리하기 위한 도구입니다. 특히 Xcode 프로젝트나 워크스페이스 설정을 쉽게 관리할 수 있도록 설계되었습니다. Tuist를 사용하면 프로젝트 설정이 훨씬 간단해지며, 이를 통해 개발자들이 프로젝트 구조를 유지하고 빌드 시스템을 관리하는 데 소요되는 시간을 크게 줄일 수 있습니다.
주요 기능은 다음과 같습니다:
- 프로젝트 자동 생성: Xcode 프로젝트나 워크스페이스를 설정하는 것을 코드로 작성하여 자동으로 생성할 수 있습니다. 이를 통해 구성의 일관성을 유지하고, 설정 오류를 줄일 수 있습니다.
- 모듈화 지원: 대규모 프로젝트를 작은 모듈로 나누고 관리하기 쉽게 만들어 줍니다.
- 캐싱: 빌드 캐싱 기능을 통해 빌드 시간을 줄입니다.
- 협업 효율성 증대: 개발자 간의 설정 충돌을 줄여 협업을 더욱 원활하게 합니다.
Tuist는 주로 Xcode의 복잡한 설정을 자동화하고 관리하는 데 초점을 맞추고 있어, 특히 여러 프로젝트나 모듈을 관리해야 하는 중대형 팀에게 유용한 도구입니다.
활용 예시 - 기본예시
Tuist를 사용하여 프로젝트를 설정하는 기본적인 예제를 설명하겠습니다.
Tuist 설치:
먼저, Tuist를 설치합니다. 터미널에서 아래 명령어를 입력합니다.curl -Ls https://install.tuist.io | bash
프로젝트 초기화:
새로운 프로젝트를 생성하려면, 프로젝트 폴더로 이동한 후 Tuist 명령어로 초기화를 수행합니다.tuist init --platform ios
이 명령어를 실행하면 기본 iOS 템플릿 프로젝트가 생성됩니다.
Project.swift
파일이 생성되는데, 이 파일에서 프로젝트의 구조와 설정을 코드로 정의할 수 있습니다.Project.swift 파일 구성:
Project.swift
는 Tuist가 프로젝트를 생성할 때 참조하는 설정 파일입니다. 여기서 예제 프로젝트 설정을 구성해 보겠습니다.import ProjectDescription let project = Project( name: "MyApp", targets: [ Target( name: "MyApp", platform: .iOS, product: .app, bundleId: "com.example.myapp", infoPlist: "Info.plist", sources: ["Sources/**"], resources: ["Resources/**"], dependencies: [] ) ] )
이 코드에서는
MyApp
이라는 이름의 iOS 앱이 정의됩니다. 이 앱의 소스 파일은Sources/
디렉토리에서, 리소스 파일은Resources/
디렉토리에서 가져옵니다. 타겟(Target) 및 의존성 등을 이 파일에서 코드로 설정할 수 있습니다.프로젝트 생성:
설정 파일을 작성한 후tuist generate
명령어를 사용하여 Xcode 프로젝트를 생성합니다.tuist generate
이 명령어를 실행하면
MyApp.xcodeproj
파일이 생성되며, 이를 Xcode로 열 수 있습니다.빌드 및 실행:
이제 Xcode에서 생성된 프로젝트를 열어 빌드하고 실행할 수 있습니다. Tuist는 설정 파일을 기반으로 Xcode 프로젝트를 생성하므로, 필요에 따라Project.swift
를 수정하고tuist generate
명령어를 다시 실행하여 변경 사항을 반영할 수 있습니다.
이러한 과정을 통해 Tuist는 설정 파일을 통해 프로젝트 구조를 쉽게 변경할 수 있도록 해 주며, 협업 환경에서 설정의 일관성을 유지하는 데 큰 도움을 줍니다.
활용예시 - 모듈화
Tuist에서 모듈화를 활용하는 예시를 살펴보겠습니다. Tuist는 대규모 프로젝트에서 각 기능이나 화면을 독립적인 모듈로 분리하여 관리하는 모듈화 작업을 쉽게 만들어 줍니다. 이를 통해 빌드 시간을 단축하고, 코드베이스를 보다 관리하기 쉽게 합니다.
다음은 Tuist를 사용하여 모듈화된 iOS 프로젝트를 구성하는 예시입니다.
1. 프로젝트 구조 설정
예를 들어, MyApp
이라는 메인 앱과 여러 개의 독립적인 모듈(예: FeatureA
, FeatureB
)을 가진 프로젝트를 설정한다고 가정합니다. 디렉터리 구조는 다음과 같을 수 있습니다.
MyApp/
├── App/
│ ├── Project.swift
│ └── Sources/
├── Features/
│ ├── FeatureA/
│ │ ├── Project.swift
│ │ └── Sources/
│ └── FeatureB/
│ ├── Project.swift
│ └── Sources/
└── Tuist/
└── Config.swift
2. 메인 앱과 모듈 설정 파일 작성
각 모듈은 개별적인 Project.swift
파일을 가집니다. 이를 통해 메인 앱과 모듈이 독립적으로 설정되고 관리됩니다.
메인 앱 (App/Project.swift
)
메인 앱은 모듈화된 Feature 모듈들에 대한 의존성을 갖습니다.
import ProjectDescription
let project = Project(
name: "MyApp",
targets: [
Target(
name: "MyApp",
platform: .iOS,
product: .app,
bundleId: "com.example.myapp",
infoPlist: "Info.plist",
sources: ["Sources/**"],
dependencies: [
.project(target: "FeatureA", path: "../Features/FeatureA"),
.project(target: "FeatureB", path: "../Features/FeatureB")
]
)
]
)
여기서 dependencies
항목에 .project(target:path:)
를 사용하여 FeatureA와 FeatureB 모듈을 메인 앱의 의존성으로 추가합니다.
FeatureA 모듈 (Features/FeatureA/Project.swift
)
각 모듈은 독립적인 타겟으로 정의됩니다. 예를 들어, FeatureA
모듈은 다음과 같이 설정할 수 있습니다.
import ProjectDescription
let project = Project(
name: "FeatureA",
targets: [
Target(
name: "FeatureA",
platform: .iOS,
product: .framework,
bundleId: "com.example.myapp.featureA",
infoPlist: "Info.plist",
sources: ["Sources/**"]
)
]
)
FeatureA
는 프레임워크로 설정되며, 메인 앱에서 가져다 사용할 수 있는 독립적인 모듈이 됩니다.
FeatureB 모듈 (Features/FeatureB/Project.swift
)
FeatureB
도 비슷하게 설정할 수 있습니다.
import ProjectDescription
let project = Project(
name: "FeatureB",
targets: [
Target(
name: "FeatureB",
platform: .iOS,
product: .framework,
bundleId: "com.example.myapp.featureB",
infoPlist: "Info.plist",
sources: ["Sources/**"]
)
]
)
3. 모듈 간 의존성 설정
필요에 따라 모듈 간에 의존성을 추가할 수 있습니다. 예를 들어, FeatureB
모듈이 FeatureA
에 의존한다고 가정하면, FeatureB/Project.swift
에 다음과 같이 추가합니다.
dependencies: [
.project(target: "FeatureA", path: "../FeatureA")
]
이렇게 하면 FeatureB
에서 FeatureA
모듈의 기능을 사용할 수 있습니다.
4. 프로젝트 생성
모든 설정이 완료되면, 프로젝트 루트에서 다음 명령어로 Xcode 프로젝트를 생성합니다.
tuist generate
이렇게 생성된 프로젝트는 각 모듈이 독립적으로 관리되며, 메인 앱에서 각 모듈을 효율적으로 가져다 사용할 수 있게 됩니다.
모듈화의 장점
- 빌드 시간 단축: 각 모듈을 독립적인 프레임워크로 빌드할 수 있으므로, 변경된 모듈만 빌드하게 되어 전체 빌드 시간을 줄입니다.
- 코드 격리: 기능별로 모듈화되어 코드가 격리되므로 코드 관리가 용이해지고, 테스트가 간편해집니다.
- 유지보수성: 독립적인 모듈 단위로 코드를 작성하고 관리하므로, 유지보수가 쉽고 코드 복잡도가 낮아집니다.
이런 방식으로 Tuist를 활용하면 대규모 iOS 프로젝트에서 모듈화된 아키텍처를 쉽게 구성하고, 프로젝트 관리와 협업이 한층 수월해집니다.
'개발 > iOS' 카테고리의 다른 글
SPM(Software Package Manager) (0) | 2024.11.20 |
---|---|
Equatable (1) | 2024.11.20 |
CI/CD, iOS 개발에서 활용 (0) | 2024.11.13 |
[iOS] RxSwift, Subject와 Relay의 차이, 그리고 Publish와 Behavior의 차이 (0) | 2024.11.13 |
[iOS] RxFlow ? (0) | 2024.11.13 |
* 쿠팡 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있습니다.