Skip to content

to.duck 프로젝트가 Tuist를 도입하게 된 계기

박효준 edited this page Oct 20, 2024 · 2 revisions

⚠️ 문제 상황

  1. 처음 시작은 파일 위치만 바뀌어도 .xcodeproj 파일 충돌이 발생하는 문제를 해결하고자 했음
  2. xUnique 사용 해보자 → SPM 지원 X 문제 발생
  3. XcodeGen → 세팅이 잘 안됐고, 레퍼런스가 많이 없다고 판단
  4. Tuist를 채택하면 xcodeproj 문제를 해결할 수 있음을 알게됨
    • VSCode로 작업하는 팀원
    • Resource 자동으로 만들어줌

→ 모듈화 개발도 할 겸 Tuist 도입



🏃🏻 문제 해결

xUnique

동일한 파일에 같은 UUID를 할당하고, 프로젝트를 이름 기준으로 정렬하여 .xcodeproj 의 충돌을 예방

→ SPM 지원 X 문제가 발생 + 너무 예전 자료임 (최근 커밋 7년전)


XcodeGen

git에 프로젝트 관련 파일을 업로드하지 않고, 각자 생성하여 사용하기에 프로젝트 파일 충돌을 예방

  • xUnique에서 안 되던 SPM 설정 가능
  • 프로젝트 충돌 방지 + 타겟 분리 가능
  • 프로젝트를 생성할 때, xcconfig 파일과 yaml 파일을 사용
  • configuration에 따라 설정이 다른 게 아니라면, yaml도 가능

우리 프로젝트는 기존의 내용을 마이그레이션해야 하는데,

레퍼런스 부족으로 인해 세팅을 머뭇거리던 찰나 Tuist를 발견


Tuist

swift로 작성된 Xcode 프로젝트를 관리할 수 있는 CLI 기반 툴 .xcodeproj 파일을 깃허브에 올리지 않으므로 충돌 X

Tuist vs XcodeGen

  • Tuist
    • ‘Project.swift’ swift 파일로 프로젝트 설정 관리
  • XcodeGen
    • yml & json으로 프로젝트 설정 관리
    • 멀티 프로젝트의 경우, 각 프로젝트 별로 project.yml을 정의하여 연결해야 했음

Tuist 장점

  • Git을 사용하면서 Xcode 프로젝트 설정(프로젝트명.xcodeproj) 파일의 충돌 방지
  • 자료가 많음
  • Tuist를 지속적인 업데이트로 관리
  • Project.swift, Workspace.swift, Dependencies.swift, Config.swift .. 등등 Swift 로 프로젝트 설정 가능 = 함수, 변수, enum, extension 등 Swift 가 제공하는 기능과 타이포 감지, 자동 완성, 빌드 등 Xcode 에서 제공하는 기능도 사용
  • 모듈화 가능

Tuist 설치

// mise 설치
curl https://mise.run | sh

// mise 버전확인
~/.local/bin/mise --version

// 버전 확인 (2024.03.09 기준)
2024.3.1 macos-arm64 (0d95fde 2024-03-04)

echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrc

// 설치 및 설정
mise use --global node@20

// 버전 확인
$ node -v

// 버전 확인 (2024.03.09 기준)
v20.11.1

// 가장 최신 버전의 Tuist 설치
mise install tuist     

// 전역설정
mise use -g tuist

// Tuist 생성 명령어
tuist init --platform ios

// 프로젝트 관리/수정
tuist generate

// Project.swift 설정할 때 사용하는 명령어
tuist edit

Tuist 프로젝트 세팅

Projects
  |
  |- App // 프로젝트
  |- DesignSystem // 모듈
  |- Network // 모듈

각 모듈/파일의 역할

아래 내용의 Wiki는 Tuist 3.x 버전을 기반으로 작성되어 있습니다.

스크린샷 2024-10-20 오후 10 29 27

‘Project Description’ 프레임워크를 사용하여 하위 앱/모듈을 정의한 것을 토대로 Xcworkspace를 생성

App Manifests

스크린샷 2024-10-20 오후 10 29 35
  • Project.swft = 프로젝트에 대한 정보를 담음 프로젝트에 대한 전체적인 정보를 이 파일에서 정의

    스크린샷 2024-10-20 오후 10 29 40
  • Resource = Assets

  • Source = 소스코드

모듈에 라이브러리 의존성 걸어주기

아래처럼 Project.swift에 정의해두면 모듈에 라이브러리 의존성 생기게 됨

스크린샷 2024-10-20 오후 10 29 46

DesignSystem, Network Manifests 모듈

이 모듈 또한, Project.swift를 내부적으로 지님 이 프로젝트 설정에 따라 모듈 정의

스크린샷 2024-10-20 오후 10 29 52

static | dynamic도 설정 가능

Dependencies

CocoaPods || SPM을 사용했었는데, 카르타고와 SPM을 Path로 설정해서 정의

스크린샷 2024-10-20 오후 10 29 58 스크린샷 2024-10-20 오후 10 30 03

외부 라이브러리 패키지 사용할때 지정해줘야 함

카르타고 + SPM 경로 설정

스크린샷 2024-10-20 오후 10 30 07

어떤 모듈이 의존성을 가져야 하는지는 ‘Artifacts’를 사용하여 정의함

Workspace

프로젝트를 묶어주는 기능 멀티 프로젝트를 하는 경우, 여기서 추가하면 됨

스크린샷 2024-10-20 오후 10 30 13

Tuist edit, fetch, generate

Tuist edit 명령어

  • 본 명령어를 통해 Xcode 창을 열어 GUI 환경에서 세팅 가능
  • 매니페스트, 모듈, 의존성, 워크스페이스.. 다 지정하는듯

Tuist fetch 명령어

  • 의존성에 적어둔 라이브러리 패키지 경로들을 로컬에 가져옴

→ 이때, 각 모듈에 Artifacts 라는 형태로 저장되게 됨

Tuist generate 명령어

위 Edit, fetch를 통해 정의한 것을 바탕으로 xcworkspace가 생성됨

Tuist 유지보수 및 상호작용 (꿀팁)

Resource Synthesizers (Resource 합성)

스크린샷 2024-10-20 오후 10 34 23

App Manifests - Resource에서 정의한 내용이 ’tuist generate’를 하면 Derived 안에 들어감

Derived

스크린샷 2024-10-20 오후 10 34 28 스크린샷 2024-10-20 오후 10 34 33

String으로 모든 Resource를 관리할 수 있도록, 코드가 자동으로 생성됨

아래처럼 Enum에 접근해서 사용하면 됨

Caching

스크린샷 2024-10-20 오후 10 34 41

의존성에 적고 ‘tuist fetch’ 명령어 입력 시 Artifacts 되어 로컬에 저장된다고 했다

이를 Pre Build 된 캐싱 파일을 생성할 수 있음

스크린샷 2024-10-20 오후 10 34 49

이렇게 하면 빌드 속도가 빨리질 수 있음

Graph

  • ‘tuist graph’ 명령어로 시각적으로 프로젝트 관계를 볼 수 있음


배운 점

  • xUnique, XcodeGen, Tuist 오픈소스를 알게됨
  • xcodeproj 충돌 해결방안 생각해봄
  • Tuist 특징 알게 됨


참조 링크