티스토리 뷰

iOS

[iOS] Tuist (feat. xcproj 충돌)

Peppo 2024. 9. 2. 16:50
728x90

협업을 하다보면 xcodeproj, xcworkspace 에서 충돌이 나는 문제를 자주 겪어볼텐데요.

저도 아래 사진처럼 일일히 충돌나는부분을 수정하느라 몇시간동안 삽질을 했었습니다..

대환장파티

 

충돌을 해결할 수 있는 툴은 몇가지가 있지만 

그 중에서 요즘 모듈화로 잘 알려진 Tuist라는 툴을 사용해보면서 정리를 해보려고 합니다.

 

모듈화는 추후 차근차근 스터디해보고 업데이트 할 예정입니다.

오늘은 세팅하는것까지만!

 

그럼 Tuist에 대해 한번 정리해보겠습니다.


 

 

블로깅 시점 (24.09.02) 

Tuist 버전은 4.25.0 입니다

알고가기

1. Tuist를 사용하게 되면 기존에 사용하던 xcodeproj, xcworkspace 파일이 필요없습니다.

프로젝트 설정하고 적용을하면 새로 만들어주기 때문이에요.

 

2. git 과 비슷한 느낌

 

스터디를 해보면서 느낀점은 CLI 명령어를 통해 

수정하고, 업데이트하고 적용하는 방식이었습니다.

 

앞으로 아래 명령어를 자주 사용하게 될거에요

// 수정
tuist edit

 

// 업데이트
tuist install

 

// 적용 및 프로젝트 파일 생성
tuist generate

 

 


 

설치

 

mise라는 툴을 사용해서 tuist를 설치해줍니다.

 

mise가 설치 되어있지 않다면 여기서 설치

mise가 설치 되어있다면 terminal에 아래 명령어 입력

mise install tuist            // 현재버전 설치
mise install tuist@x.y.z      // 특정버전 설치
mise install tuist@3          // 3.x버전 설치

 


 

프로젝트 생성

Tuist를 적용하기 위해서 먼저 빈 폴더가 필요합니다.

 

터미널에서 아래와 같이 입력

mkdir TuistStudy // 프로젝트이름 
cd TuistStudy    // 이동해주시고

 

또는 Finder에서 그냥 빈 폴더 만드셔도 됩니다.

 

아래 명령어를 입력해주시면 

tuist init

 

기본적으로 폴더들이 세팅됩니다.

 

하나씩 뜯어볼까요

 

Tests

  • Test코드 관련된 파일들을 여기에 넣으면 될것 같아요

 

 

Resources

  • Assets, Fonts 와 같은 종류들이 모여있는 곳입니다.

추후 블로깅하겠지만 이곳에 Color, Image, Font 등 Namespace로 알아서 정리되어서 쏙쏙 뽑아 쓰실 수 있습니다. 
(하드코딩으로 값을 가져올 필요없이요)

 

Sources

  • 나머지 소스코드들이 이곳에 들어갑니다. 
  • View, ViewModel, Model 등 나누기 나름일것 같아요

 

Project | Package

  • Project.swift
    • 해당 파일에서 프로젝트 세팅을 합니다. Tuist를 사용하면서 가장 많이 손 볼곳이 될거에요
  • Package.swift
    • 이름 그대로 패키지를 관리하는 파일입니다.  
  • config는 추후 스터디후 블로깅하겠습니다.

 

여기까지 하고 아래 명령어를 입력해줍시다.

tuist generate

 

아래 Xcode 화면이 잘 뜨신다면 잘 따라오고 계신겁니다!


Project 세팅

이제 Project 세팅을 해서 비어있는 값들을 채워주고, 원하는 세팅으로 바꿔볼겁니다.

 

 

아래 명령어를 입력해주세요

tuist edit

 

그럼 Manifests가 뜨는데 Project.swift를 열어줍시다

 

Project 부분도 하나씩 알아봅시다

import ProjectDescription

let project = Project(
    name: "프로젝트이름",                    // 프로젝트 이름
    organizationName: "OrganizationName", // 조직 이름
    settings: nil,                        // 다른 프로젝트 설정을 지정할 수 있음.
    targets: [                            // 프로젝트와 관련된 대상 목록
      .target(                             
         name: projectName,               // 앱 이름
         platform: .iOS,                  // 제공하는 플랫폼 (iOS, iPad 등)
         product: .app,                   // product 용도 (app, bundle, frmaework 등)
         bundleId: "",                    // 번들 ID
         infoPlist: .default,             // infoPlist 경로
         sources: ["TuistStudy/Source/**"], // source 디렉터리에 있는 모든 source 파일을 지정 (** = 와일드 카드 패턴 → 하위 모든 경로의 파일들 포함)
         resources: "TuistStudy/Resources/**",
         dependencies: [],                // 외부 프레임워크의 종속성을 여기에 추가
         settings: nil                    // 다른 설정을 지정하는데 사용
      )
    ]
)

 

저는 아래와 같이 작성했어요

import ProjectDescription

let appName: String = "TuistStudy"
let bundleId: String = "com.peppo.tuistStudy"
let infoPlist: [String: Plist.Value] = [
    "UILaunchScreen": [
        "UIColorName": "",
        "UIImageName": "",
    ],
]

let project = Project(
    name: appName,
    targets: [
        .target(
            name: appName,
            destinations: .iOS,
            product: .app,
            bundleId: bundleId,
            infoPlist: .extendingDefault(with: infoPlist),
            sources: ["TuistStudy/Sources/**"],
            resources: ["TuistStudy/Resources/**"],
            dependencies: [
                // 추후 라이브러리 아래와 같이 추가 (Package.swift 에도 수정필요)
//                .external(name: "Alamofire")
            ]
        ),
        .target(
            name: "TuistStudyTests",
            destinations: .iOS,
            product: .unitTests,
            bundleId: "io.tuist.TuistStudyTests",
            infoPlist: .default,
            sources: ["TuistStudy/Tests/**"],
            resources: [],
            dependencies: [.target(name: "TuistStudy")]
        ),
    ]
)

 

 

Tuist는 Swift로 작성할 수 있기 때문에 상수, 함수 등으로 처리할 수 있습니다.

 

Project.swift는 이정도로 작성해두고 이제 적용을 해봅시다 

적용 명령어는 

tuist generate

 

잘 적용이 됐다면 Tuist 관리하에 프로젝트 파일들이 다시 생성됩니다.

 

실패시에는 문제되는 부분을 아래와 같이 잘 알려주기 때문에 해당 부분을 수정한다음 tuist generate 해주면 됩니다.

(아래 원인은 organizationName, settings의 값이 비어있었고, product에 불필요한 ' , ' 가 있었습니다.)

실패시 뜨는 로그

 

 

프로젝트 진행도중 Tuist 적용할 때 폴더세팅

저는 프로젝트 진행중 Tuist 적용하고 있었는데

View, ViewModel, Model 등 여러가지 폴더들을 Sources 경로에 다 넣어줬습니다. (드래그앤드롭)

폴더구조들을 아래와 같이 세팅해줬고

Sources 폴더구조

적용을 해줍니다.

tuist generate

 

그럼 아래와 같이 Sources 폴더 안에 싹 정리가 됩니다.

나중에 역할별로 더 모듈화도 해볼 예정이에요. (그건 추후 블로깅!)

 

Project 파일 세팅했을때 Sources/** 로 했기때문에 Sources 폴더내부에 알아서 정리가 되는 모습입니다~!

 

 


Tuist는 계속 버전이 업데이트 되는만큼 변화도 많습니다.

처음엔 레퍼자료들을 찾는데 버전이 달라서 없는 프로퍼티들도 꽤많아 고생을 했던 기억이있네요.

다시 한번 느낍니다 공식문서의 중요성을..

그만큼 공식문서에 참고할만한 example 깃헙들도 제공해주고 있으니 잘 찾아보면서 스터디하면 좋을것 같습니다.

 

협업간 충돌을 피하기위해 스터디하고 있지만 

생각보다 제공해주는 매력적인 기능들이 많은것 같은데 

하나씩 정리해보면서 추가적으로 블로깅 해보도록 하겠습니다 :) 

 


참고

1. https://docs.tuist.io/

 

What is Tuist? | Tuist

 

docs.tuist.io

2. https://www.kodeco.com/24508362-tuist-tutorial-for-xcode (요건 참고만 하세요 버전이 다릅니다.)

 

Tuist Tutorial for Xcode

Learn how to use Tuist to create and manage complex Xcode projects and workspaces on-the-fly.

www.kodeco.com

 

 

728x90