-
What's new in Tuist v4Tuist 2024. 7. 4. 18:45
안녕하세요. 그린입니다 🍏
이번 포스팅은 Tuist v4로 오면서 기존 v3에서 어떤것들이 변경되었는지 한번 공식문서를 통해 살펴보려 합니다 🙋🏻
Tuist v4로 넘어오면서 몇가지 변경사항들이 생겨났고 이를 통해 프로젝트를 더 편하게 관리하고 유지하기 쉬워졌습니다.
어떤것들이 변경되었는지 주요 사항들을 살펴보시죠!
tuistenv를 통한 버전 관리 방법의 삭제
Tuist v3까지는 설치 스크립트가 tuistenv라는 툴을 설치했습니다.
tuistenv는 특정 버전의 Tuist를 설치하고 활성화하여 환경 간 일관성을 보장해주는 역할을 했습니다.
즉, 버전 관리를 해준것이죠.
그런데 이제는 Tuist의 기능 범위를 줄이기 위해서 tuistenv를 제거하고, 동일 역할을 하지만 더 유연하고 다양한 도구에 사용할 수 있는 Mise라는 툴을 도입했습니다 😃
그렇기에, 이제는 mise를 사용하는것을 권장하며 여러 환경에서 버전을 동일하게 설치하고 활성화할 수 있습니다.
만약 이전 tuistenv를 사용하고 있었다면 현재 버전의 Tuist를 제거하고 새롭게 설치해야 합니다.
그렇기에, 현재 버전을 아래 명령어를 통해 삭제할 수 있습니다.
curl -Ls https://uninstall.tuist.io | bash
그 후 mise를 설치하고 활성화 하면 되죠!
요약하자면, tuistenv는 이제 더 이상 사용되지 않고 Mise가 도입되어 해당 툴을 사용하면 됩니다.
기존 Tuist는 삭제하고 Mise를 이용해 tuist를 새롭게 설치하고 사용하면 되는것이죠.
Homebrew를 이용해 Tuist도 설치할 수 있지만, mise가 권장이라는 점 ☺️
ProjectDescription 모델에서 init 생성자의 삭제
API 가독성과 표현을 개선하기 위해 모든 ProjectDescription 모델에서 init 생성자가 제거되었습니다.
이제는 모든 모델의 인스턴스를 만들때는 init 생성자 대신 정적 생성자를 이용해야 합니다.
즉, 기존 Tuist 프로젝트 파일의 코드도 변경해야겠죠?
정적 생성자는 static func를 의미하며, 해당 메서드의 이름은 모델과 동일하게 가져가요.
아래처럼 원래는 타겟을 생성할때 이니셜라이저를 통해 사용할 수 있었어요.
let target = Target(name: "green", product: .app ...)
이제는 아래와 같이 사용해야 합니다.
let target = Target.target(name: "green", product: .app ...)
--no-cache가 --no-binary-cache로 이름 변경
--no-cache의 이름 자체가 모호한것의 이유로 해당 플래그가 바이너리 캐시를 가리킨다는 것을 명확히 하고자 --no-binary-cache로 이름이 변경되었습니다.
아래와 같이 기존에 --no-cache를 사용해 tuist generate를 하고 있었을텐데요.
tuist generate --no-cache
이제는 --no-binary-cache로 변경해야 합니다.
tuist generate --no-binary-cache
tuist fetch에서 tuist install로 이름 변경
기존 tuist fetch 명령어가 tuist install로 이름이 변경되었습니다.
즉, tuist fetch를 통해 프로젝트를 업데이트하고 있었다면, 이제는 tuist install 명령을 통해 해줘야하죠.
그게 다입니다 😃
의존성 정의 방식의 변경
기존에는 의존성 관리를 위해 Dependencies.swift 파일에서 종속성을 정의할 수 있었어요.
그런데 이 형식은 Dependabot, Renovatebot과 같은 도구에서 종속성을 자동으로 업데이트하는 지원을 중단했습니다.
또한, 사용자에게 불필요한 간접성이 추가되었죠.
그렇기에, v4에서부턴 Package.swift를 통해 종속성을 정의하는 방식을 가져가게 되었습니다.
Package.swift를 사용하는것이 더 많은 툴과 호환성이 있으며 불필요한 간접성을 제거해줄 수 있게 되었어요.
v4 이전에는 요런식으로 Dependencies를 사용했다면,
import ProjectDescription let dependencies = Dependencies( swiftPackageManager: [ .remote( url: "https://github.com/pointfreeco/swift-composable-architecture.git", requirement: .exact("0.40.2") ), .remote( url: "https://github.com/johnpatrickmorgan/TCACoordinators.git", requirement: .exact("0.2.0") ), .remote( url: "https://github.com/Alamofire/Alamofire.git", requirement: .exact("5.6.4") ), .remote( url: "https://github.com/CombineCommunity/CombineExt.git", requirement: .exact("1.8.1") ), .remote( url: "https://github.com/kean/Nuke.git", requirement: .exact("12.1") ), ], platforms: [.iOS, .watchOS] )
이제는 Package를 통해 아래와 같이 사용해야 합니다.
import PackageDescription #if TUIST import ProjectDescription let packageSettings = PackageSettings( productTypes: [ "ComposableArchitecture": .framework, "TCACoordinators": .framework, "Nuke": .framework, "NukeUI": .framework, "Lottie": .framework, "Get": .framework, "KakaoSDK": .framework ] ) #endif let package = Package( name: "Green", dependencies: [ .package(url: "https://github.com/pointfreeco/swift-composable-architecture.git", exact: "1.8.0"), .package(url: "https://github.com/johnpatrickmorgan/TCACoordinators", from: "0.10.0"), .package(url: "https://github.com/kean/Nuke.git", from: "12.0.0"), .package(url: "https://github.com/airbnb/lottie-ios.git", from: "4.4.3"), .package(url: "https://github.com/kean/Get.git", from: "2.2.0"), .package(url: "https://github.com/Kuniwak/MultipartFormDataKit.git", from: "1.0.1"), .package(url: "https://github.com/kakao/kakao-ios-sdk", from: "2.22.2") ] )
여기서 #if TUIST 전처리문을 통해 Tuist 관련 설정을 Package.swift 파일에 포함시킵니다.
tuist cache warm에서 tuist cache로 이름 변경
tuist cache warm의 명령을 간결하게 이름을 가져가기 위해 tuist cache로 변경되었습니다.
기존 tuist cache warm을 사용중이셨다면, 이제는 tuist cache로 사용하면 됩니다.
tuist cache print-hashes에서 tuist cache --print-hashes로 이름 변경
플래그의 변경이 생겼습니다.
이제는 tuist cache --print-hashes를 사용하여 모든 스크립트와 문서에서 해당 플래그로 업데이트하여야 합니다.
기존 캐시 해시를 출력하기 위해 아래와 같이 사용되었는데요.
#!/bin/bash # 캐시 해시 출력 tuist cache print-hashes
이젠 아래와 같이 사용하는겁니다.
#!/bin/bash # 캐시 해시 출력 tuist cache --print-hashes
해당 변경을 통해 명령어 구조가 더 명확해졌고 플래그의 역할이 더 분명히 전달되게 되었습니다.
캐싱 프로필의 제거
Tuist v4 이전에는 Tuist/Config.swift에서 캐시에 대한 구성을 포함하는 캐싱 프로필을 정의할 수 있었어요.
그런데 해당 기능은 프로젝트 생성 시 사용된 프로필이 아닌 다른 프로필을 사용해 생성 프로세스에 사용할 때 혼란이 있었습니다.
또한, 디버그 프로필을 이용해 앱의 릴리즈 버전을 빌드하게 되는 등 예상치 못한 결과들도 초래했죠.
그렇기에 v4부터는 이제 프로젝트 생성 시 --configuration 옵션을 도입했습니다.
만약 캐싱 프로필을 사용하고 있었다면 이젠 해당 옵션을 사용하도록 프로젝트를 업데이트 해야 합니다.
--skip-cache 플래그 제거
generate 명령 시 --skip-cache 플래그가 제거 되었습니다.
이제는 바이너리 캐시를 건너뛸 타겟을 인자로 사용해 제어해야 합니다.
기존에는 아래와 같이 사용되었다면
tuist generate --skip-cache Foo
이젠 제거하여 아래와 같이 사용해야 하죠.
tuist generate Foo
서명 기능 중단
사아닝은 이미 fastlane과 xcode등의 커뮤니티 도구로 이미 잘 해결되었기에 Tuist에서 코드 사이닝 기능을 목표로 하지 않아 빼버리고 Tuist의 핵심 기능에 더 집중하기로 했다고 합니다.
만약 Tuist의 서명 기능을 사용하고 있었다면 이젠 다음과 같은 방법으로 직접 구현해볼 수 있어요.
1️⃣ 인증서와 프로비저닝 프로파일을 암호화하여 저장소에 저장, 프로젝트 생성 시 복호화하여 설치하는 스크립트 작성
2️⃣ 기존 인증서와 프로파일을 가져와 암호화하는 스크립트 작성
즉, 이를 위해서 아래와 같은 스텝이 필요할것 같아요.
1️⃣ 인증서와 프로파일을 파일 시스템 혹은 환경 변수에 저장된 키로 복호화하는 스크립트
2️⃣ 키체인에 인증서를 설치하고, ~/Library/MobileDevice/Provisioning Profiles 디렉토리에 프로비저닝 프로파일 설치 스크립트
3️⃣ 기존 인증서와 프로파일을 암호화는 스크립트
이를 통해 개발자가 Tuist의 코드 서명 기능을 직접 구현해 사용할 수 있습니다.
카르타고 의존성 지원 삭제
v4 이전에는 Dependencies.swift 파일에서 Carthage의 종속성을 정의할 수 있고 실제 패치도 가능했죠.
그런데 이제는 SPM이 선호되는 미래라 생각하여 기본 지원은 제거하였습니다.
이제는 카르타고를 직접 사용해야 합니다. 원한다면~!
만약 카르타고를 사용해 종속성을 관리하고 있었다면, 먼저 카르타고를 사용해 미리 컴파일된 프레임워크나 XCFramework를 카르타고의 표준 디렉토리에 다운로드 해야 합니다.
그 후, TargetDependency.xcframework나 TargetDependency.framework 케이스를 사용해 해당 바이너리를 태그에서 참조해야 합니다.
다만 아직도 여전히 카르타고는 지원되고 있습니다.
카르타고의 지원이 중단된것은 아니며 바뀐것은 아니며 종속성을 가져오는 책임에 있습니다.
이전에는 Tuist에서 카르타고를 거쳐야 했다면 이제는 다이렉트로 카르타고에서 사용하기에 그 역할 책임의 변경에 있습니다.
TargetDependency.packagePlugin API 삭제
Tuist v4 이전에는 TargetDependency.packagePlugin을 사용해 패키지 플러그인 종속성을 정의할 수 있었습니다.
그러나 SPM이 새로운 패키지 유형을 도입한 후, 미래에 대비하기 위해 API를 유연하게 개선하고자 하여 개선되었습니다.
만약 기존 TargetDependency.packagePlugin을 사용하고 있었다면, 이제는 TargetDependency.package를 사용해 원하는 패키지 타입을 인자로 전달해야 됩니다.
더는 사용되지 않는 API들 제거
Tuist v3에서 이미 디프리케이트된 API들이 이제 완전히 삭제되었습니다.
만약 더 이상 사용되지 않는 API들을 사용하고 있다면 업데이트로 반영해야겠네요!
해당 PR을 보면 어떤것들이 삭제되었는지 확인해볼 수 있어요.
마무리
v4로 오면서 어떤것들이 변경되었고 왜 변경되었는지 알아봤습니다.
각자 프로젝트도 이에 발맞춰 업데이트 해놓으면 좋겠죠!? 😃
레퍼런스
'Tuist' 카테고리의 다른 글
Tuist v4 설치 및 사용 (with. 자동화) (64) 2024.07.01 Tuist의 Configuration 설정하기 (19) 2023.05.18 Multiple commands 에러 바로잡기 (feat. GoogleService-Info.plist) (8) 2023.05.04 Tuist에서 Firebase Crashlytics 설정하기 (15) 2023.04.27 Tuist를 통해 SwiftLint 사용하기 (10) 2023.04.25