合成されたファイル
Tuistは、Xcodeプロジェクトの管理と作業に利便性をもたらすために、生成時にファイルとコードを生成することができます。このページでは、この機能と、あなたのプロジェクトでそれを使用する方法について学びます。
対象リソース
Xcode プロジェクトは、ターゲットへのリソースの追加をサポートしています。しかし、ソースとリソースが頻繁に移動されるモジュール化されたプロジェクトで作業する場合は特に、チームにいくつかの課題をもたらします:
- 一貫性のないランタイム・アクセス :リソースが最終製品のどこに置かれ、どのようにアクセスするかは、ターゲット製品に依存します。例えば、ターゲットがアプリケーションの場合、リソースはアプリケーションバンドルにコピーされます。このため、バンドル構造を前提にリソースにアクセスするコードになり、コードの推論が難しくなり、リソースが動き回るので理想的ではありません。
- リソースをサポートしていない製品 :静的ライブラリのように、バンドルではないためリソースをサポートしない製品もあります。そのため、例えばフレームワークのような別の製品タイプに頼らざるを得なくなり、プロジェクトやアプリにオーバーヘッドが増えるかもしれません。例えば、スタティックフレームワークは、最終製品に静的にリンクされ、最終製品にリソースをコピーするためだけにビルドフェーズが必要になります。または、動的フレームワークは、Xcode がバイナリとリソースの両方を最終製品にコピーしますが、フレームワークを動的にロードする必要があるため、アプリの起動時間が長くなります。
- 実行時エラーが発生しやすい :リソースは名前と拡張子(文字列)によって識別されます。そのため、これらのいずれかにタイプミスがあると、リソースにアクセスしようとしたときにランタイムエラーが発生します。これはコンパイル時に検出されず、リリース時にクラッシュにつながる可能性があるため、理想的ではありません。
Tuistは、、バンドルとリソースにアクセスするための統一されたインターフェイスを合成し、 、実装の詳細を抽象化することで、上記の問題を解決している。
推奨
Tuist-synthesizedインターフェイスを通してリソースにアクセスすることは必須ではないが、コードの推論が容易になり、リソースの移動が容易になるため、我々はそれを推奨している。
リソース
Tuistは、SwiftのInfo.plist やエンタイトルメントなどのファイルの内容を宣言するためのインターフェースを提供する。これは、ターゲットやプロジェクト間で一貫性を確保し、コンパイル時に問題をキャッチするためにコンパイラを活用するのに便利です。また、コンテンツをモデル化し、ターゲットやプロジェクト間で共有するために、独自の抽象化を考え出すこともできます。
プロジェクトが生成されると、Tuistはそれらのファイルの内容を合成し、それらを定義したプロジェクトを含むディレクトリに相対するDerived ディレクトリに書き込む。
::: 先端 ジティニョーレ・ディレクトリー
プロジェクトの.gitignore ファイルにDerived ディレクトリを追加することをお勧めします。
:::
バンドル・アクセサ
Tuistは、ターゲットリソースを含むバンドルにアクセスするためのインターフェイスを合成する。
スウィフト
ターゲットは、バンドルを公開するバンドル タイプの拡張を含みます:
swift
let bundle = Bundle.moduleObjective-C
Objective-Cでは、{Target}Resources 、バンドルにアクセスするためのインターフェイスを取得します:
objc
NSBundle *bundle = [MyFeatureResources bundle];::: 警告 インターナル・ターゲットの制限
現在、TuistはObjective-Cソースのみを含む内部ターゲットに対してリソースバンドルのアクセサを生成しません。これはissue #6456で追跡されている既知の制限です。
:::
バンドルを通して図書館のリソースをサポートする
ターゲット製品、例えばライブラリがリソースをサポートしていない場合、Tuistはそのリソースを製品タイプバンドル のターゲットに含めることで、最終的な製品が完成し、インターフェイスが正しいバンドルを指すようにする。
リソース・アクセサ
リソースは、文字列を使って名前と拡張子で識別される。これはコンパイル時に捕捉されず、リリース時にクラッシュにつながる可能性があるため、理想的ではありません。それを防ぐために、TuistはSwiftGenをプロジェクト生成プロセスに統合し、リソースにアクセスするためのインターフェースを合成します。そのおかげで、どんな問題でもコンパイラを活用してリソースに自信を持ってアクセスすることができる。
Tuistにはtemplatesが含まれており、デフォルトで以下のリソースタイプのアクセッサを合成します:
| リソースタイプ | 自動生成ファイル |
|---|---|
| イメージと色 | アセット+{ターゲット}.swift |
| ストリングス | 文字列+{ターゲット}.swift |
| リスト | {NameOfPlist}.swift |
| フォント | フォント+{ターゲット}.swift |
| ファイル | ファイル+{ターゲット}.swift |
注: プロジェクト・オプションに
disableSynthesizedResourceAccessorsオプションを渡すことで、プロジェクト単位でリソース・アクセッサの合成を無効にすることができます。
カスタムテンプレート
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()])参照
このフィクスチャ](https://github.com/tuist/tuist/tree/main/cli/Fixtures/ios_app_with_templates)で、カスタムテンプレートを使ってリソースへのアクセサーを合成する方法の例を見ることができます。
