iOS/Tuist

기존 프로젝트에 tuist 적용하기 1편

min_ee 2024. 9. 10. 18:13

 

개인 앱의 모듈화를 진행하기 전 tuist를 적용해두면 추후 프로젝트 관리가 수월하지 않을까란 생각이 들어 급 적용..

 

 

이 글은 Tuist 4.5.1 버전 기준입니다.

글을 쓰는 지금도 다듬는 중이니 개선할 점이 있다면 댓글로 알려주시면 감사하겠습니다.

 

이번 글에 포함되는 내용

- Tuist 설치

- Project.swift 생성

- Dependency 추가

- Script 추가(GoogleService)

 

Tuist 설치

https://docs.tuist.io/guides/quick-start/install-tuist

 

Install Tuist | Tuist

 

docs.tuist.io

tuist 공식 페이지에서 추천하는 mise를 통해 설치함

 

 

기존 프로젝트에 적용하기

0. 폴더 이동하기

적용하는 방법은 다들 다르겠지만 나는 Tuist 초기 생성할 때 처럼 Resource, Source를 나눠줌

Resource
ㄴ *.xcassets
ㄴ *.lproj
ㄴ Lottie
ㄴ GoogleService

Source
ㄴ *.swift

Resource의 경우 기존의 경로들에 지정해줘도 되지만 좀 더 편한 관리를 위해 옮겨줌

Source에는 그외 swift파일, plist 를 넣음

 

1. 프로젝트 루트 폴더에 Project.swift 파일 생성

tuist을 init하려면 해당 폴더가 비어야 함

하지만 나는 기존 프로젝트가 있기 때문에 터미널에서 nano Project.swift 입력 후 실행

^O -> Enter -> ^X 순으로 진행

 

2. Project.swift에 프로젝트 정보 입력

terminal에서 프로젝트 루트 폴더로 이동한 다음 tuist edit를 입력 후 실행하면 Manifests 프로젝트가 열림

 

let project = Project(
    name: "ProjectO",
    organizationName: "Organizer Name",
    targets: [
        .target(
            name: "ProjectO",
            destinations: .iOS,
            product: .app,
            bundleId: "com.projectO.dev",
            deploymentTargets: .iOS("16.0"),
            infoPlist: "ProjectO/Sources/Info.plist",
            sources: ["ProjectO/Sources/**"],
            resources: ["ProjectO/Resources/**"],
            entitlements: "ProjectO/ProjectO.entitlements",
            scripts: 
            [
	            .GoogleServiceInfo
            ],
            dependencies: defaultDependencies()
        ),
    ]
)

Project.swift 에 위 코드를 입력하면 일단 큰 틀은 만든거임

 

dependencies -> 외부 라이브러리, 프로젝트 내부 프레임워크 등

script -> Build Phases 에 있는 스크립트

여기에 작성하는 것은 밑에 있음

 

Manifests 프로젝트를 닫고 Control+C를 해주고 tuist generate를 해주면

 

Derived-Sources 폴더에 프로젝트의 Resources에 있던 에셋 등이 코드로 재탄생한 것을 볼 수 있음

+) 첫 제너레이트 후 에셋 내부의 색상, 아이콘 등이 정상적으로 잘 들어가있는지 확인하기.

색상의 경우 설정한 색상 코드가 사라지고, 이미지는 이미지 파일만 싹 다 사라져서 엄청 당황했다.

 

3. Dependency 적용

Manifests 폴더에서 Tuist 폴더 생성 후 Package.swift 파일 생성

(tuist가 3.x 버전일 경우 Dependencies.swift 로 생성)

// Package.swift
import PackageDescription

let package = Package(
    name: "PackageName",
    platforms: [.iOS(.v16)],
    dependencies: [
        .package(url: "https://github.com/SnapKit/SnapKit.git", exact: "5.7.1"),
        .package(url: "https://github.com/firebase/firebase-ios-sdk.git", exact: "10.22.1"),
        .package(url: "https://github.com/CombineCommunity/CombineCocoa.git", exact: "0.4.1"),
        .package(url: "https://github.com/airbnb/lottie-spm.git", exact: "4.5.0"),
        .
        .
    ]
)

기존에도 SPM을 사용하고 있었기에 참고해서 넣어줌

 

Project.swift 파일로 돌아와서 TargetDependency들을 추가해준다

// Project.swift
private func defaultDependencies() -> [TargetDependency] {
    [
        .external(name: "SnapKit"),
        .external(name: "Then"),
        .external(name: "FirebaseAnalytics"),
	.
        .
        .
        .external(name: "GoogleMobileAds"),
        .external(name: "CombineCocoa"),
        .external(name: "Lottie"),
    ]
}

이것도 기존 디펜던시 참고해서 추가.

 

 tuist install 후 tuist generate를 하면 Dependencies 폴더가 추가된 걸 확인할 수 있음

(tuist 3.X는 tuist fetch -> tuist generate)

 

4. GoogleServiceInfo 추가하기

기존 프로젝트에 있는 스크립트를 그대로 복붙 하면 됨

// Package.swift
extension TargetScript {
    static let GoogleServiceInfo = TargetScript.post(
        script:
            """
            case "${CONFIGURATION}" in
            "Debug" )
            cp -r "$SRCROOT/ProjectO/Resources/GoogleService/GoogleService-Info-Debug.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info-Debug.plist" ;;
            "Release" )
            cp -r "$SRCROOT/ProjectO/Resources/GoogleService/GoogleService-Info-Release.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info-Release.plist" ;;
            *)
            ;;
            esac
            """,
        name: "GoogleService-Info",
        basedOnDependencyAnalysis: true
    )
    
}

 

기존에는 GoogleService-Info.plist로 파일명을 통일하고 config에 따라 경로만 다르게 했는데 

tuist 적용할 경우 파일명을 다르게 해줘야 함.

자꾸 두 개라고 오류뱉음ㅠ

 

5. 실행하기

커스텀 색상이나 폰트가 없을 경우 정상적으로 실행 되겠지만

둘 중 하나라도 있다면 빌드가 실패하거나 화면이 내가 원하는대로 나오지 않을 거임

이건 다음 글에..

 

그리고 현재 프로젝트는 xcconfig 파일을 생성하지 않았음

배포를 하려면 이 부분도 생성하는 것이 관리에 편리하긴함..

이 부분도 작성할 수 있으면 작성해보겠음

 

Reference

https://docs.tuist.io/references/project-description/structs/project

 

Project | Tuist

 

docs.tuist.io