# Tuist v3에서 v4로 전환 {#from-tuist-v3-to-v4} Tuist 4](https://github.com/tuist/tuist/releases/tag/4.0.0)의 출시와 함께, 장기적으로 프로젝트를 더 쉽게 사용하고 유지 관리할 수 있도록 프로젝트에 몇 가지 획기적인 변경 사항을 도입할 기회를 가졌습니다. 이 문서에서는 Tuist 3에서 Tuist 4로 업그레이드하기 위해 프로젝트에 적용해야 할 변경 사항을 간략하게 설명합니다. ### `tuistenv를 통한 삭제된 버전 관리` {#dropped-version-management-through-tuistenv} Tuist 4 이전에는 설치 스크립트가 설치 시 `tuist` 로 이름이 변경되는 도구( `tuistenv`)를 설치했습니다. 이 도구는 여러 환경에서 결정성을 보장하는 Tuist 버전을 설치하고 활성화하는 작업을 처리했습니다. Tuist의 기능 표면을 줄이기 위해 같은 작업을 수행하지만 더 유연하고 여러 도구에서 사용할 수 있는 [Mise](https://mise.jdx.dev/)를 위해 `tuistenv` 를 삭제하기로 결정했습니다. ` tuistenv` 를 사용 중이었다면 `curl -Ls https://uninstall.tuist.io | bash` 를 실행하여 현재 버전의 Tuist를 제거한 다음 원하는 설치 방법을 사용하여 설치해야 합니다. Mise는 여러 환경에서 결정론적으로 버전을 설치하고 활성화할 수 있으므로 사용을 강력히 권장합니다. ::: code-group ```bash [Uninstall tuistenv] curl -Ls https://uninstall.tuist.io | bash ``` ::: > [!WARNING] > **Ci 환경 및 Xcode 프로젝트에서 오류 발생** > > Mise가 제공하는 결정론을 전반적으로 수용하기로 결정했다면 [CI > 환경](https://mise.jdx.dev/continuous-integration.html) 및 [Xcode > 프로젝트](https://mise.jdx.dev/ide-integration.html#xcode)에서 Mise를 사용하는 방법에 대한 설명서를 > 확인하는 것이 좋습니다. > [!NOTE] > **Homebrew Supported** > > macOS에서 널리 사용되는 패키지 관리자인 Homebrew를 사용하여 Tuist를 설치할 수 있습니다. 홈브루를 사용하여 Tuist를 설치하는 > 방법은 > 설치 가이드에서 확인할 수 있습니다. ### 삭제됨 `init` 생성자를 `ProjectDescription에서 삭제됨` models {#dropped-init-constructors-from-projectdescription-model} API의 가독성과 표현력을 개선하기 위해 모든 `ProjectDescription` 모델에서 `init` 생성자를 제거하기로 결정했습니다. 이제 모든 모델은 모델의 인스턴스를 생성하는 데 사용할 수 있는 정적 생성자를 제공합니다. ` init` 생성자를 사용 중이었다면 정적 생성자를 사용하도록 프로젝트를 업데이트해야 합니다. > [!TIP] > **네이밍 규칙** > > 우리가 따르는 명명 규칙은 모델 이름을 정적 생성자의 이름으로 사용하는 것입니다. 예를 들어 `Target` 모델의 정적 생성자는 > `Target.target` 입니다. ### `--no-cache` 이름을 `--no-binary-cache` {#renamed-nocache-to-nobinarycache}로 변경했습니다. `--no-cache` 플래그가 모호하기 때문에, 바이너리 캐시를 가리킨다는 것을 명확히 하기 위해 `--no-binary-cache` 로 이름을 변경하기로 했습니다. ` --no-cache` 플래그를 사용했다면 프로젝트를 `--no-binary-cache` 플래그 대신 사용하도록 업데이트해야 합니다. ### `튜스트 가져오기` 를 `튜스트 설치` {#renamed-tuist-fetch-to-tuist-install}로 이름 변경 업계 관례에 따라 `tuist fetch` 명령의 이름을 `tuist install` 으로 변경했습니다. ` tuist fetch` 명령을 사용 중이었다면 대신 `tuist install` 명령을 사용하도록 프로젝트를 업데이트해야 합니다. ### [ `Package.swift` 를 종속성용 DSL로 채택](https://github.com/tuist/tuist/pull/5862) {#adopt-packageswift-as-the-dsl-for-dependencieshttpsgithubcomtuisttuistpull5862} Tuist 4 이전에는 `Dependencies.swift` 파일에서 종속성을 정의할 수 있었습니다. 이 독점적인 형식은 종속성을 자동으로 업데이트하는 [Dependabot](https://github.com/dependabot) 또는 [Renovatebot](https://github.com/renovatebot/renovate)과 같은 도구의 지원을 중단시켰습니다. 또한 사용자에게 불필요한 간접 경로를 도입했습니다. 따라서 저희는 `Package.swift` 를 Tuist에서 종속성을 정의하는 유일한 방법으로 채택하기로 결정했습니다. ` Dependencies.swift` 파일을 사용 중이었다면, `Tuist/Dependencies.swift` 의 내용을 루트의 `Package.swift` 로 옮기고 `#if TUIST` 지시문을 사용하여 통합을 구성해야 합니다. Swift 패키지 종속성 을 통합하는 방법에 대한 자세한 내용은 여기에서 확인할 수 있습니다. ### `tuist-cache warm` 을 `tuist-cache` {#renamed-tuist-cache-warm-to-tuist-cache}로 이름 변경 간결성을 위해 `tuist cache warm` 명령의 이름을 `tuist cache` 로 변경하기로 결정했습니다. ` tuist cache warm` 명령을 사용 중이었다면, 대신 `tuist cache` 명령을 사용하도록 프로젝트를 업데이트해야 합니다. ### 이름 변경 `tuist cache print-hashes` 에서 `tuist cache --print-hashes` {#renamed-tuist-cache-printhashes-to-tuist-cache-printhashes}로 변경되었습니다. `tuist cache` 명령의 플래그임을 명확히 하기 위해 `tuist cache print-hashes` 명령의 이름을 `tuist cache --print-hashes` 로 바꾸기로 결정했습니다. ` tuist cache print-hashes` 명령을 사용 중이었다면 대신 `tuist cache --print-hashes` 플래그를 사용하도록 프로젝트를 업데이트해야 합니다. ### 제거된 캐싱 프로필 {#removed-caching-profiles} Tuist 4 이전에는 캐시에 대한 구성이 포함된 `Tuist/Config.swift` 에서 캐싱 프로필을 정의할 수 있었습니다. 이 기능을 제거하기로 결정한 이유는 프로젝트 생성 과정에서 프로젝트 생성에 사용된 프로필이 아닌 다른 프로필을 사용할 때 혼동을 일으킬 수 있기 때문입니다. 또한 사용자가 디버그 프로필을 사용하여 앱의 릴리스 버전을 빌드할 때 예기치 않은 결과가 발생할 수 있습니다. 대신 프로젝트를 생성할 때 사용할 구성을 지정하는 데 사용할 수 있는 `--configuration` 옵션을 도입했습니다. 캐싱 프로필을 사용 중이었다면 대신 `--configuration` 옵션을 사용하도록 프로젝트를 업데이트해야 합니다. ### 인수를 위해 `--skip-cache` 제거됨 {#removed-skipcache-in-favor-of-arguments} 인수를 사용하여 바이너리 캐시를 건너뛸 대상을 제어할 수 있도록 `generate` 명령에서 `--skip-cache` 플래그를 제거했습니다. ` --skip-cache` 플래그를 사용했다면 대신 인수를 사용하도록 프로젝트를 업데이트해야 합니다. ::: code-group ```bash [Before] tuist generate --skip-cache Foo ``` ```bash [After] tuist generate Foo ``` ::: ### [삭제된 서명 기능](https://github.com/tuist/tuist/pull/5716) {#dropped-signing-capabilitieshttpsgithubcomtuisttuistpull5716} 서명 작업은 이미 [Fastlane](https://fastlane.tools/)과 같은 커뮤니티 도구와 Xcode 자체에서 훨씬 더 잘 해결하고 있습니다. 저희는 서명이 Tuist의 확장 목표이며 프로젝트의 핵심 기능에 집중하는 것이 더 낫다고 생각했습니다. 저장소에 있는 인증서와 프로필을 암호화하고 생성 시 적절한 위치에 설치하는 것으로 구성된 Tuist 서명 기능을 사용 중이라면 프로젝트 생성 전에 실행되는 자체 스크립트에서 해당 로직을 복제하고 싶을 수 있습니다. 특히 - 파일 시스템 또는 환경 변수에 저장된 키를 사용하여 인증서 및 프로필을 해독하고 키 체인에 인증서를 설치하고 디렉터리 `~/Library/MobileDevice/Provisioning\ Profiles` 에 프로비저닝 프로필을 설치하는 스크립트입니다. - 기존 프로필 및 인증서를 가져와서 암호화할 수 있는 스크립트입니다. > [!TIP] > **서명 요구 사항** > > 서명하려면 키체인에 올바른 인증서가 있어야 하고 프로비저닝 프로필이 `~/Library/MobileDevice/Provisioning\ 프로필` > 디렉터리에 있어야 합니다. ` security` 명령줄 도구를 사용하여 키체인에 인증서를 설치하고 `cp` 명령을 사용하여 프로비저닝 프로필을 > 올바른 디렉터리에 복사할 수 있습니다. ### `Dependencies.swift를 통해 삭제된 카르타고 통합` {#dropped-carthage-integration-via-dependenciesswift} Tuist 4 이전에는 Carthage 종속성을 `Dependencies.swift` 파일에 정의할 수 있었고, 사용자는 `tuist fetch` 를 실행하여 가져올 수 있었습니다. 특히 Swift 패키지 관리자가 종속성 관리의 기본 방법이 될 미래를 고려할 때, 이는 Tuist의 장기적인 목표라고 생각했습니다. Carthage 종속성을 사용하는 경우 `Carthage` 를 직접 사용하여 미리 컴파일된 프레임워크와 XCFramework를 Carthage의 표준 디렉토리로 가져온 다음 `TargetDependency.xcframework` 및 `TargetDependency.framework` 사례를 사용하여 태그셋에서 해당 바이너리를 참조해야 합니다. > [!NOTE] > **Carthage Is Still Supported** > > 일부 사용자는 카르타고 지원을 중단한 것으로 이해했습니다. 그렇지 않습니다. Tuist와 Carthage의 결과물 간의 계약은 시스템에 저장된 > 프레임워크와 XCFrameworks에 대한 것입니다. 변경된 유일한 사항은 종속성을 가져오는 책임이 있는 사람입니다. 이전에는 튜이스트가 > 카르타고를 통해 가져왔지만 이제는 카르타고가 가져옵니다. ### `TargetDependency.packagePlugin` API {#dropped-the-targetdependencypackageplugin-api}를 삭제했습니다. 튜이스트 4 이전에는 `TargetDependency.packagePlugin` 케이스를 사용하여 패키지 플러그인 종속성을 정의할 수 있었습니다. Swift 패키지 관리자가 새로운 패키지 유형을 도입하는 것을 본 후, 우리는 더 유연하고 미래에 대비할 수 있는 방향으로 API를 반복하기로 결정했습니다. ` TargetDependency.packagePlugin` 을 사용했다면, 대신 `TargetDependency.package` 를 사용하고 인자로 사용하려는 패키지 유형을 전달해야 합니다. ### [사용 중단된 API](https://github.com/tuist/tuist/pull/5560) {#dropped-deprecated-apishttpsgithubcomtuisttuistpull5560} 튜이스트 3에서 더 이상 사용되지 않는 것으로 표시된 API를 제거했습니다. 더 이상 사용되지 않는 API를 사용 중이었다면 프로젝트를 업데이트하여 새 API를 사용해야 합니다.