Xcode 프로젝트 관리를 위한 Tuist 알아보기

Kanghoon
8 min readFeb 11, 2021
Tuist Github Repository

최근 Tuist 라는 Xcode 프로젝트 관리 도구를 알게 되었습니다. 이전에 살펴본 XcodeGen 과 유사하게 Xcode 프로젝트를 생성 및 관리할 수 있는 도구입니다. 오늘은 이 Tuist 를 가볍게 사용해보려고 합니다.

Tuist

Tuist 는 XcodeGen 과 유사하게 Xcode 프로젝트를 관리할 수 있는 툴입니다. XcodeGen 과 차이점이 있다면 XcodeGen 은 yml 이나 json 으로 프로젝트 설정을 관리하지만, Tuist 는 Project.swift 라는 Swift 파일로 설정을 관리합니다.

먼저 Tuist 를 설치하면서 시작해보겠습니다. 아래의 스크립트를 사용하여 설치할 수 있습니다.

$ curl -Ls https://install.tuist.io|bash

기본 프로젝트 생성해보기

가이드 문서를 따라 초기 프로젝트를 설정해보려고 합니다. Github 디렉토리를 생성하고, tuist init 을 실행합니다.

$ mkdir Github
$ cd Github
$ tuist init --platform ios
tuist init 결과

tuist init 을 실행하면 위와 같은 파일들이 자동 생성됩니다. XcodeGen 과 다르게 초기 프로젝트 설정이 굉장히 편리합니다.

생성된 파일을 보면 Gihtub (App), GithubKit, GithubUI 라는 3가지 타겟 폴더가 보이고, 앞서 이야기했던 프로젝트 설정이 담긴 Project.swift 파일이 보입니다.

추가로 Plugins , Tuist 디렉토리가 있습니다. Tuist 디렉토리에는 Config.swift 파일과 ProjectDescriptionHelpers 디렉토리가 보이네요. (Tuist 디렉토리는 뒤에서 알아볼게요)

생성된 파일을 살펴보기 전에 먼저 프로젝트 파일을 생성 해봅시다.

$ tuist generate

위 명령어를 사용하면 xcodeproj 와 xcworkspace 를 생성합니다. 기본적으로 의존하는 프로젝트를 모두 생성하기 때문에 workspace 의 특정 프로젝트만 생성하고 싶은 경우에는 --project-only 옵션을 사용하면 됩니다.

tuist generate 결과

프로젝트 파일들과 함께 Derived 폴더가 생성되었는데 Info.plist 파일들과 Bundle 관련 코드가 추가로 생성되었습니다. 자동생성된 파일들은 설정으로 추가/제거가 가능합니다.

Project.swift

지금까지 기본 프로젝트 생성 결과를 살펴보았습니다. 이제는 실제 앱을 개발할 수 있도록 프로젝트를 설정해보겠습니다. 먼저 메인 설정 파일인 Project.swift 를 살펴봅시다.

Project.swift

초기에 생성된 Project.swift 파일입니다. 세가지의 import 코드와 앱 설정 코드를 볼 수 있습니다. Project.app 함수를 통해 Github 이라는 앱 프로젝트에 GithubKit 과 GithubUI 타겟을 추가한 것을 볼 수 있습니다.

Project.app() 함수는 무엇일까요?

바로 처음에 생성되었던 Tuist/ProjectDescriptionHelpers/Project+Templates.swift 에 정의된 함수입니다.

Project+Templates.swift

Tuist 는 Project description helper 를 지원합니다. 프로젝트나 타겟이 따라야 하는 설정 및 생성을 코드로 작성해 간편하게 사용하도록 지원합니다. 쉽게 템플릿이라고 생각하시면 좋을 것 같습니다.

기본적으로 정의된 템플릿 코드들은 실제로 활용하기는 어려워서, 제거하고 원하는 프로젝트 구성에 필요한 템플릿 코드를 직접 작성하여 활용하면 됩니다.

프로젝트 구성하기

이제 실제로 사용할 프로젝트를 구성해보겠습니다. 목표로 하는 구성은 아래와 같습니다. 3개의 프로젝트를 생성할 예정이고 앱 타겟을 제외한 두개의 프로젝트에는 Static Library 로 생성할 예정입니다.

# Project
- Github(App)
- GithubUI(Static Library)
- GithubFoundation(Static Library)

먼저 원하는 프로젝트 구성을 쉽게 재사용할 수 있도록 project description helper 코드를 먼저 작성해 봅시다.

아래의 스크립트를 실행하면 프로젝트를 설정할 수 있도록 Manifest 프로젝트가 실행됩니다.

$ tuist edit
tuist edit 결과

앞서 살펴봤었던 Tuist 디렉토리와 Project.swift 파일들을 Manifest 프로젝트로 볼 수 있게 되었습니다. 이제 자동완성을 이용해 프로젝트를 안전하게 구성할 수 있습니다 ㅎㅎ

이제 타겟 템플릿을 작성해보겠습니다. 각 프로젝트에 필요한 타겟들을 쉽게 생성할 수 있도록 메서드를 작성해줍니다.

기본적으로 모든 타겟에 필요한 내용들은 공통으로 작성한뒤, 나머지 속성들은 함수 파라미터로 구성하도록 합니다.

이제 프로젝트를 구성해봅시다. 기존에는 Targets 폴더에 타겟들이 구성되어 있습니다. (1 Project > 3 Targets)

이제 이를 모두 프로젝트로 변경합니다. 구성은 아래와 같습니다.

Github(App), GithubKit, GithubUI 프로젝트에 각각 Project.swift 파일을 추가해줍니다. 이렇게 세개의 프로젝트를 구성할 수 있습니다.

먼저 App 프로젝트의 Project.swift 파일을 작성해보겠습니다.

먼저 기본 설정들을 작성합니다. Scheme 는 수동으로 생성할 것이기에 비활성화 합니다.

여러 Stage 의 앱을 구성하기 위해 configurations 는 Dev, Alpha, Prod 로 구성했습니다.

다음은 targets 와 scheme 를 지정합니다.

타겟은 앱 타겟과 유닛 테스트 타겟을 추가하였습니다.

다음으로 Scheme 를 추가합니다. 각 Stage 앱을 별도의 타겟으로 구성할 수도 있지만, Scheme 으로 설정하는 것을 추천합니다. 쉽게 수정할 수 있으며 파일을 추가/수정할 때 관리 포인트가 줄어듭니다.

위와 동일한 방식으로 GithubKit, GithubUI 의 프로젝트도 생성합니다.

Project.swift 파일의 코드는 대부분 유사합니다. 실제로 운영중인 앱에 대해 작성할 때는 settings 와 schemes 를 조금 더 신경써서 작성해주시면 될 것 같습니다.

다음은 Workspace.swift 파일을 작성합니다.

위에서 작성한 세 프로젝트를 묶어서 Workspace 로 구성할 수 있습니다. Workspace.swift 는 루트 폴더에 위치하면 됩니다.

XcodeScheme 는 비활성화 하고 Workspace 는 활성화합니다. Workspace scheme 는 전체 프로젝트에 대해 Unit Tests 를 돌리는데 사용할 수 있습니다.

자 이제 필요한 프로젝트 구성파일은 모두 작성했습니다. tuist generate 를 사용해서 프로젝트를 다시 생성해봅시다.

생성 결과물

결과로 Github.xcworkspace 파일이 생성된 것을 확인할 수 있고, 해당 workspace 를 실행하면 위의 결과를 볼 수 있습니다.

결론

tuist.io 를 살펴보면 Tuist 는 많은 기능들을 지원합니다. XcodeGen 과 다르게 Workspace 를 쉽게 구성할 수 있어 여러 프로젝트를 생성하여 연결할 때 조금 더 쉽다는 느낌도 받았습니다.

Swift 로 프로젝트 설정을 작성할 수 있어서 컴파일 시점에 프로젝트 구성 코드를 검증할 수 있다는 장점이 있습니다. tuist cache 를 이용한 모듈 캐싱도 지원하는 것 같아 이 부분도 활용해보면 좋을 것 같습니다.

프로젝트 관리를 위해 어떤 도구를 도입할지 고민중인 분이 계시다면 Tuist 를 추천해봅니다.

--

--