생성된 파일
Tuist는 생성 시점에 파일과 코드를 생성하여 Xcode 프로젝트를 관리하고 작업하는 데 편의를 제공합니다. 이 페이지에서는 이 기능과 프로젝트에서 사용하는 방법을 알아봅니다.
타겟 리소스#
Xcode 프로젝트는 타겟에 리소스를 추가하는 것을 지원합니다. 그러나 소스와 리소스가 자주 이동되는 모듈식 프로젝트에서 작업할 때 특히 몇 가지 과제를 팀에 제시합니다:
- 일관되지 않은 런타임 접근: 리소스가 최종 제품에 어디에 배치되고 어떻게 접근하는지는 타겟 제품에 따라 다릅니다. 예를 들어, 타겟이 애플리케이션을 나타내는 경우 리소스는 애플리케이션 번들에 복사됩니다. 이로 인해 리소스에 접근하는 코드가 번들 구조에 대한 가정을 하게 되며, 이는 코드의 추론을 어렵게 하고 리소스 이동을 복잡하게 하므로 이상적이지 않습니다.
- 리소스를 지원하지 않는 제품: 정적 라이브러리와 같이 번들이 아닌 특정 제품은 리소스를 지원하지 않습니다. 따라서 프레임워크와 같은 다른 제품 유형을 사용해야 할 수 있으며, 이는 프로젝트나 앱에 일부 오버헤드를 추가할 수 있습니다. 예를 들어, 정적 프레임워크는 최종 제품에 정적으로 링크되며, 리소스만 최종 제품에 복사하려면 빌드 단계가 필요합니다. 또는 동적 프레임워크의 경우 Xcode는 바이너리와 리소스를 모두 최종 제품에 복사하지만, 프레임워크를 동적으로 로드해야 하므로 앱의 시작 시간이 증가합니다.
- 런타임 오류 발생 가능성: 리소스는 이름과 확장자(문자열)로 식별됩니다. 따라서 이러한 값 중 하나라도 오타가 있으면 리소스에 접근할 때 런타임 오류가 발생합니다. 이는 컴파일 시간에 발견되지 않고 릴리스에서 충돌을 일으킬 수 있으므로 이상적이지 않습니다.
Tuist는 구현 세부 사항을 추상화하는 번들과 리소스에 접근하기 위한 통합 인터페이스를 생성하여 위의 문제를 해결합니다.
Tuist가 생성한 인터페이스를 통해 리소스에 접근하는 것이 필수 사항은 아니지만, 코드의 추론을 쉽게 하고 리소스 이동을 간편하게 하므로 이를 권장합니다.
리소스#
Tuist는 Swift에서 Info.plist 또는 entitlements와 같은 파일의 콘텐츠를 선언하기 위한 인터페이스를 제공합니다. 이는 타겟과 프로젝트 간 일관성을 보장하고 컴파일러를 활용해 컴파일 시간에 문제를 발견하는 데 유용합니다. 또한 콘텐츠 모델링을 위한 자체 추상화를 만들어 타겟과 프로젝트 간에 공유할 수도 있습니다.
프로젝트가 생성되면 Tuist는 해당 파일의 콘텐츠를 생성하고 이를 정의하는 프로젝트가 포함된 디렉터리를 기준으로 Derived 디렉터리에 작성합니다.
프로젝트의 .gitignore 파일에 Derived 디렉터리를 추가하는 것을 권장합니다.
번들 접근자#
Tuist는 타겟 리소스를 포함하는 번들에 접근하기 위한 인터페이스를 생성합니다.
Swift#
타겟에는 번들을 노출하는 Bundle 타입의 확장자가 포함됩니다:
let bundle = Bundle.module
Objective-C#
Objective-C에서는 번들에 접근하기 위해 {Target}Resources 인터페이스를 사용합니다:
NSBundle *bundle = [MyFeatureResources bundle];
현재 Tuist는 Objective-C 소스만 포함하는 내부 타겟에 대해 리소스 번들 접근자를 생성하지 않습니다. 이는 issue #6456에서 추적 중인 알려진 제한 사항입니다.
라이브러리와 같은 타겟 제품이 리소스를 지원하지 않는 경우, Tuist는 리소스를 제품 유형이 bundle인 타겟에 포함하여 최종 제품에 올바르게 배치되고 인터페이스가 올바른 번들을 참조하도록 합니다. 이렇게 생성된 번들은 자동으로 tuist:synthesized 태그가 지정되며 부모 타겟의 모든 태그를 상속받으므로 캐시 프로필에서 대상으로 지정할 수 있습니다.
리소스 접근자#
리소스는 문자열을 사용하여 이름과 확장자로 식별됩니다. 이는 컴파일 시간에 발견되지 않고 릴리스에서 충돌을 일으킬 수 있으므로 이상적이지 않습니다. 이를 방지하기 위해 Tuist는 프로젝트 생성 과정에 SwiftGen을 통합하여 리소스에 접근하기 위한 인터페이스를 생성합니다. 이를 통해 컴파일러를 활용해 문제를 발견하며 자신 있게 리소스에 접근할 수 있습니다.
Tuist에는 기본적으로 다음 리소스 유형에 대한 접근자를 생성하기 위한 템플릿이 포함되어 있습니다:
| 리소스 유형 | 생성된 파일 |
|---|---|
| 이미지 및 색상 | Assets+{Target}.swift |
| 문자열 | Strings+{Target}.swift |
| Plist | {NameOfPlist}.swift |
| 폰트 | Fonts+{Target}.swift |
| 파일 | Files+{Target}.swift |
참고: 프로젝트 옵션에
disableSynthesizedResourceAccessors옵션을 전달하여 프로젝트별로 리소스 접근자 생성을 비활성화할 수 있습니다.
사용자 정의 템플릿#
SwiftGen이 지원하는 다른 리소스 유형에 대한 접근자를 생성하기 위한 자체 템플릿을 제공하려면 Tuist/ResourceSynthesizers/{name}.stencil에 생성하면 됩니다. 여기서 이름은 리소스의 카멜케이스 버전입니다.
| 리소스 | 템플릿 이름 |
|---|---|
| strings | Strings.stencil |
| assets | Assets.stencil |
| plists | Plists.stencil |
| fonts | Fonts.stencil |
| coreData | CoreData.stencil |
| interfaceBuilder | InterfaceBuilder.stencil |
| json | JSON.stencil |
| yaml | YAML.stencil |
| files | Files.stencil |
액세서리를 생성할 리소스 유형 목록을 구성하려면 사용할 리소스 생성기 목록을 전달하는 Project.resourceSynthesizers 속성을 사용할 수 있습니다:
let project = Project(resourceSynthesizers: [.string(), .fonts()])
리소스에 대한 접근자를 생성하기 위해 사용자 정의 템플릿을 사용하는 방법을 확인하려면 이 예제를 참조하세요.