합성된 파
Tuist는 생성할 때 프로젝트를 관리하고 작업하기 위한 몇 가지 규칙을 파일과 코드를 생성할 수 있습니다. 이 페이지에서 이러한 기능에 대해 배우면 여러분의 프로젝트에서 사용할 수 있게 될 것 입니다.
Target 리소스
Xcode 프로젝트는 Target에 리소스 추가를 지원하지만, 팀에게 몇 가지 문제를 안겨줍니다, 특히 소스와 리소스가 종종 옮겨지는 모듈화된 프로젝트를 가지고 작업할 때 발생 합니다:
- 비일관적인 실행 중 접근: 최종 제품에 있는 Resource의 위치와 거기에 어떻게 접근하는 지는 Target 제품에 달렸습니다. 예를 들어, 여러분의 Target이 어플리케이션을 나타낸다면, Resource는 어플리케이션 Bundle에 복제 됩니다. 이러면 코드가 Bundle 구조를 가정하는 Resource에 접근할 수 있게 되는데, 이상적이진 않습니다, 이렇게 하면 코드를 분석하기 어렵게 만들고 Resource를 멀리 이동하지 못하게 만들기 때문 입니다.
- Resource를 지원하지 않는 제품: 번들화 되지 않아서 Resource를 지원하지 못하는 Static 라이브러리 같은 제품이 있습니다. 그런 이유로, 여러분은 다른 제품 Type으로 변경 해야 하던지 해야 합니다, 예를 들어서 여러분의 프로젝트나 앱에 몇 가지 과도한 작업이 추가될 수도 있는 Framework로 말이죠. 예를 들어서, Static Framework는 고정적으로 최종 제품에 연결 될 것 이고 Build Phase는 Resource를 최종 제품에 복사하는데만 필요로 합니다. 아니면 Xcode가 Binary와 Resource 둘 다 최종 제품으로 복사할 동적 Framework, 하지만 그것은 앱의 시작 시간을 증가 시킵니다, Framework가 동적으로 불러와질 필요가 있기 때문입니다.
- 잦은 런타임 오류: 리소스는 이름과 확장자(문자열)로 식별 되어서 이 중 하나라도 오타가 있으면 리소스에 액세스하려고 할 때 런타임 오류가 발생합니다. 이는 컴파일 할 때 감지되지 않고 배포 후에 충돌을 일으킬 수 있으므로 이상적이지 않습니다.
Tuist는 이러한 문제를 구현 세부 사항을 추상화한 번들 및 리소스에 액세스할 수 있는 통합 인터페이스를 합성하여 해결합니다.
권장사항
Tuist 통합 인터페이스를 통해 리소스에 액세스하는 것이 필수가 아닐지라도, 코드를 더 쉽게 이해하고 리소스를 이동하기 쉽게 해주기 때문에 이를 권장합니다.
리소스
Tuist는 Info.plist나 Entitlement 같은 파일의 내용을 Swift로 선언하는 인터페이스를 제공하는데, 이는 Target과 프로젝트 전반에서 일관성을 보장하고 컴파일 시 컴파일러를 활용하여 문제를 파악하는 데 유용합니다. 또한 이 내용을 모델링하고 여러 대상과 프로젝트에 공유하기 위해 여러분만의 추상화를 만들어 낼 수도 있습니다.
프로젝트가 생성되면, Tuist는 해당 파일의 콘텐츠를 합성하여 해당 파일을 정의하는 프로젝트가 포함된 경로에 있는Derived 디렉터리에 작성합니다.
Derived 디렉토리를 무시하세요
프로젝트의 .gitignore 파일에 Derived 디렉터리 추가를 권장 합니다.
번들 접근자
Tuist는 Target 리소스를 포함하는 번들에 접근하기 위한 인터페이스를 합성합니다.
Swift
Target은 번들을 노출하는 Bundle Type의 Extension을 가질 것 입니다:
swift
let bundle = Bundle.moduleObjective-C
Objective-C에는 번들에 접근할 수 있는 {Target 이}Resources 인터페이스를 제공합니다:
objc
NSBundle *bundle = [MyFeatureResources bundle];내부 Target 제한
현재 Tuist는 Objective-C 소스만 가지는 내부 Target에 대한 Resource 번들 접근자를 생성하지 않는데, 이슈 #6456에서 보고되어 알려진 제한 사항입니다.
번들을 통한 라이브러리 리소스 지원
예를 들어 라이브러리와 같은 대상 제품이 리소스를 지원하지 않는 경우, Tuist는 리소스가 최종 제품에 포함되고 인터페이스가 올바른 번들을 가리키도록 하기 위해 번들 제품 유형 대상에 리소스를 포함시킵니다.
리소스 액세스자
리소스는 문자열을 사용하여 이름과 확장자로 식별됩니다. 이는 컴파일 시 포착되지 않고 릴리스 시 충돌을 일으킬 수 있으므로 이상적이지 않습니다. 이를 방지하기 위해 Tuist는 프로젝트 생성 프로세스에 SwiftGen을 통합하여 리소스에 액세스할 수 있는 인터페이스를 합성합니다. 덕분에 컴파일러를 활용하여 리소스에 자신 있게 액세스하여 문제를 포착할 수 있습니다.
Tuist에는 기본적으로 다음 리소스 유형에 대한 접근자를 합성하는 템플릿이 포함되어 있습니다:
| 리소스 유형 | 합성된 파일 |
|---|---|
| 이미지 및 색상 | Assets+{Target}.swift |
| 문자열 | 문자열+{Target}.swift |
| 목록 | {NameOfPlist}.swift |
| 글꼴 | Fonts+{Target}.swift |
| 파일 | Files+{Target}.swift |
참고: 프로젝트별 리소스 접근자 합성을 비활성화하려면 프로젝트 옵션에
disableSynthesizedResourceAccessors옵션을 전달하여 프로젝트별로 리소스 접근자 합성을 비활성화할 수 있습니다.
사용자 지정 템플릿
SwiftGen](https://github.com/SwiftGen/SwiftGen)에서 지원해야 하는 다른 리소스 유형에 대한 접근자를 합성하기 위해 자체 템플릿을 제공하려는 경우 Tuist/ResourceSynthesizers/{name}.stencil 에서 만들 수 있으며, 여기서 이름은 리소스의 대소문자 버전입니다.
| 참고자료 | 템플릿 이름 |
|---|---|
| 문자열 | 문자열.스텐실 |
| 자산 | Assets.stencil |
| 목록 | Plists.stencil |
| 글꼴 | Fonts.stencil |
| 핵심 데이터 | CoreData.stencil |
| 인터페이스 빌더 | 인터페이스 빌더 스텐실 |
| json | JSON.stencil |
| yaml | YAML.stencil |
| 파일 | Files.stencil |
접근자를 합성할 리소스 유형 목록을 구성하려면 Project.resourceSynthesizers 프로퍼티에 사용하려는 리소스 합성기 목록을 전달하면 됩니다:
swift
let project = Project(resourceSynthesizers: [.string(), .fonts()])정보 참조 ::: info 참조
사용자 지정 템플릿을 사용하여 리소스에 대한 액세스자를 합성하는 방법의 예는 이 수정 사항에서 확인할 수 있습니다.
:::
