# 合成ファイル{#synthesized-files}

Tuistは、Xcodeプロジェクトの管理と作業に利便性をもたらすために、生成時にファイルとコードを生成することができます。このページでは、この機能と、あなたのプロジェクトでそれを使用する方法について学びます。

## 対象リソース{#target-resources}

Xcode
プロジェクトは、ターゲットへのリソースの追加をサポートしています。しかし、ソースとリソースが頻繁に移動されるモジュール化されたプロジェクトで作業する場合は特に、チームにいくつかの課題をもたらします：

- **一貫性のないランタイム・アクセス**
  ：リソースが最終製品のどこに置かれ、どのようにアクセスするかは、ターゲット製品に依存します。例えば、ターゲットがアプリケーションの場合、リソースはアプリケーションバンドルにコピーされます。このため、バンドル構造を前提にリソースにアクセスするコードになり、コードの推論が難しくなり、リソースが動き回るので理想的ではありません。
- **リソースをサポートしていない製品**
  ：静的ライブラリのように、バンドルではないためリソースをサポートしない製品もあります。そのため、例えばフレームワークのような別の製品タイプに頼らざるを得なくなり、プロジェクトやアプリにオーバーヘッドが増えるかもしれません。例えば、スタティックフレームワークは、最終製品に静的にリンクされ、最終製品にリソースをコピーするためだけにビルドフェーズが必要になります。または、動的フレームワークは、Xcode
  がバイナリとリソースの両方を最終製品にコピーしますが、フレームワークを動的にロードする必要があるため、アプリの起動時間が長くなります。
- **実行時エラーが発生しやすい**
  ：リソースは名前と拡張子（文字列）によって識別されます。そのため、これらのいずれかにタイプミスがあると、リソースにアクセスしようとしたときにランタイムエラーが発生します。これはコンパイル時に検出されず、リリース時にクラッシュにつながる可能性があるため、理想的ではありません。

Tuistは、**、バンドルとリソースにアクセスするための統一されたインターフェイスを合成し、** 、実装の詳細を抽象化することで、上記の問題を解決している。

> [!WARNING]
> **Recommended**
>
> Tuist-synthesizedインターフェイスを通してリソースにアクセスすることは必須ではないが、コードの推論が容易になり、リソースの移動が容易になるため、我々はそれを推奨している。


## リソース {#resources}

Tuistは、Swiftの`Info.plist`
やエンタイトルメントなどのファイルの内容を宣言するためのインターフェースを提供する。これは、ターゲットやプロジェクト間で一貫性を確保し、コンパイル時に問題をキャッチするためにコンパイラを活用するのに便利です。また、コンテンツをモデル化し、ターゲットやプロジェクト間で共有するために、独自の抽象化を考え出すこともできます。

プロジェクトが生成されると、Tuistはそれらのファイルの内容を合成し、それらを定義したプロジェクトを含むディレクトリに相対する`Derived`
ディレクトリに書き込む。

> [!TIP]
> **Gitignore The Derived Directory**
>
> プロジェクトの`.gitignore` ファイルに`Derived` ディレクトリを追加することをお勧めします。


## バンドル・アクセサ{#bundle-accessors}

Tuistは、ターゲットリソースを含むバンドルにアクセスするためのインターフェイスを合成する。

### スウィフト{#swift}

ターゲットは、バンドルを公開する`バンドル` タイプの拡張を含みます：

```swift
let bundle = Bundle.module
```

### Objective-C{#objectivec}

Objective-Cでは、`{Target}Resources` 、バンドルにアクセスするためのインターフェイスを取得します：

```objc
NSBundle *bundle = [MyFeatureResources bundle];
```

> [!WARNING]
> **Limitation With Internal Targets**
>
> 現在、TuistはObjective-Cソースのみを含む内部ターゲットに対してリソースバンドルのアクセサを生成しません。これは[issue
> #6456](https://github.com/tuist/tuist/issues/6456)で追跡されている既知の制限です。


> [!TIP]
> **Supporting Resources In Libraries Through Bundles**
>
> ターゲット製品、例えばライブラリがリソースをサポートしていない場合、Tuistはそのリソースを製品タイプ`バンドル`
> のターゲットに含めることで、最終的な製品が完成し、インターフェイスが正しいバンドルを指すようにする。


## リソース・アクセッサ{#resource-accessors}

リソースは、文字列を使って名前と拡張子で識別される。これはコンパイル時に捕捉されず、リリース時にクラッシュにつながる可能性があるため、理想的ではありません。それを防ぐために、Tuistは[SwiftGen](https://github.com/SwiftGen/SwiftGen)をプロジェクト生成プロセスに統合し、リソースにアクセスするためのインターフェースを合成します。そのおかげで、どんな問題でもコンパイラを活用してリソースに自信を持ってアクセスすることができる。

Tuistには[templates](https://github.com/tuist/tuist/tree/main/cli/Sources/TuistGenerator/Templates)が含まれており、デフォルトで以下のリソースタイプのアクセッサを合成します：

| リソースタイプ | 自動生成ファイル              |
| ------- | --------------------- |
| イメージと色  | `アセット+{ターゲット}.swift`  |
| ストリングス  | `文字列+{ターゲット}.swift`   |
| リスト     | `{NameOfPlist}.swift` |
| フォント    | `フォント+{ターゲット}.swift`  |
| ファイル    | `ファイル+{ターゲット}.swift`  |

> 注: プロジェクト・オプションに`disableSynthesizedResourceAccessors`
> オプションを渡すことで、プロジェクト単位でリソース・アクセッサの合成を無効にすることができます。

#### カスタムテンプレート{#custom-templates}

SwiftGen](https://github.com/SwiftGen/SwiftGen)
によってサポートされなければならない、他のリソースタイプへのアクセサを合成するために独自のテンプレートを提供したい場合、`Tuist/ResourceSynthesizers/{name}.stencil`
で作成することができます。

| リソース         | テンプレート名                        |
| ------------ | ------------------------------ |
| ストリングス       | `文字列.ステンシル`                    |
| 資産           | `資産.ステンシル`                     |
| ちりめん         | `プリスト.ステンシル`                   |
| フォント         | `フォント.ステンシル`                   |
| コアデータ        | `CoreData.stencil（コアデータ・ステンシル` |
| インターフェイスビルダー | `InterfaceBuilder.stencil`     |
| json         | `JSON.stencil`                 |
| ヤムル          | `YAML.stencil`                 |
| ファイル         | `ファイル.ステンシル`                   |

アクセサーを合成するリソースタイプのリストを設定したい場合は、`Project.resourceSynthesizers`
プロパティを使用して、使用したいリソース合成器のリストを渡します：

```swift
let project = Project(resourceSynthesizers: [.string(), .fonts()])
```

> [!NOTE]
> **Reference**
>
> このフィクスチャ](https://github.com/tuist/tuist/tree/main/cli/Fixtures/ios_app_with_templates)で、カスタムテンプレートを使ってリソースへのアクセサーを合成する方法の例を見ることができます。

