기존 프로젝트에 tuist 적용하기 1편
개인 앱의 모듈화를 진행하기 전 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