모범 사례
수년 동안 다양한 팀 및 프로젝트와 함께 작업하면서 저희는 Tuist 및 Xcode 프로젝트 작업 시 따를 것을 권장하는 일련의 모범 사례를 확인했습니다. 이러한 모범 사례는 필수 사항은 아니지만 프로젝트를 유지 관리하고 확장하기 쉬운 방식으로 구성하는 데 도움이 될 수 있습니다.
Xcode#
낙담 패턴#
원격 환경을 모델링하기 위한 구성#
많은 조직에서 빌드 구성을 사용하여 다양한 원격 환경을 모델링하지만(예: 디버그-프로덕션 또는 릴리스-캐너리), 이 접근 방식에는 몇
가지 단점이 있습니다:
- 불일치: 그래프 전체에 구성 불일치가 있는 경우 빌드 시스템에서 일부 대상에 대해 잘못된 구성을 사용할 수 있습니다.
- 복잡성: 프로젝트는 추론하고 유지 관리하기 어려운 로컬 구성과 원격 환경의 긴 목록으로 끝날 수 있습니다.
빌드 구성은 다양한 빌드 설정을 구현하도록 설계되었으며, 프로젝트에 디버그 및 릴리스 이상의 설정이 필요한 경우는 거의 없습니다. 서로
다른 환경을 모델링해야 할 필요성은 다른 방식으로 달성할 수 있습니다:
- 디버그 빌드에서: 앱 개발 시 액세스할 수 있어야 하는 모든 구성(예: 엔드포인트)을 앱에 포함시키고 런타임에 전환할 수 있습니다. 전환은 스키마 실행 환경 변수를 사용하거나 앱 내의 UI를 사용하여 수행할 수 있습니다.
- 릴리스 빌드에서: 릴리즈의 경우 릴리즈 빌드가 바인딩된 구성만 포함할 수 있으며 컴파일러 지시어를 사용하여 구성을 전환하는 런타임 로직은 포함할 수 없습니다.
Tuist는 비표준 구성을 지원하며 바닐라 Xcode 프로젝트에 비해 관리하기 쉽지만 종속성 그래프 전체에서 구성이 일관되지 않은 경우 경고를 받게 됩니다. 이를 통해 빌드 안정성을 보장하고 구성 관련 문제를 방지할 수 있습니다.
프로젝트 동적 생성#
빌드 가능한 폴더#
Tuist 4.62.0은 병합 충돌을 줄이기 위해 Xcode 16에 도입된 기능인 빌드 가능한 폴더 (Xcode의 동기화된 그룹)에 대한 지원을 추가했습니다.
Tuist의 와일드카드 패턴(예: Sources/**/*.swift)은 이미 생성된 프로젝트에서 병합 충돌을 제거하지만, 빌드 가능한 폴더는
추가적인 이점을 제공합니다:
- 자동 동기화: 프로젝트 구조가 파일 시스템과 동기화된 상태로 유지되므로 파일을 추가하거나 제거할 때 다시 생성할 필요가 없습니다.
- AI 친화적인 워크플로: 코딩 어시스턴트와 에이전트가 프로젝트 재생성 없이 코드베이스를 수정할 수 있습니다.
- 더 간단한 구성: 명시적인 파일 목록을 관리하는 대신 폴더 경로를 정의합니다.
보다 간소화된 개발 환경을 위해 기존의 Target.sources 및 Target.resources 속성 대신 빌드 가능한 폴더를
채택하는 것이 좋습니다.
let target = Target(
name: "App",
buildableFolders: ["App/Sources", "App/Resources"]
)
let target = Target(
name: "App",
sources: ["App/Sources/**"],
resources: ["App/Resources/**"]
)
의존성#
CI에서 강제로 해결된 버전#
CI에 Swift 패키지 관리자 종속 요소를 설치할 때 결정론적 빌드를 보장하기 위해 --force-resolved-versions 플래그를
사용하는 것이 좋습니다:
tuist install --force-resolved-versions
이 플래그를 사용하면 종속성이 Package.resolved 에 고정된 정확한 버전을 사용하여 해결되므로 종속성 해결의 비결정성으로 인한
문제를 제거할 수 있습니다. 이는 재현 가능한 빌드가 중요한 CI에서 특히 중요합니다.