コンテンツへスキップ

Rust キャッシュ

Tuist はサポートされている Rust のコンパイル成果物をキャッシュするため、ビルド成果物が削除された後でも Cargo がそれらを再利用できます。このキャッシュは Tuist CLI に組み込まれており、別途インストールする必要のあるキャッシュ実行ファイルや Cargo プラグインはありません。

実験的なコンパイルキャッシュ

このキャッシュは実験的であり、Appleシリコン搭載のMacで検証済みです。ライブラリは、すべてのプラットフォームでコンパイラが読み取ったソースに基づいてキャッシュされますが、Linuxでのライブラリキャッシュはまだ検証されていません。ビルドスクリプト、プロシージャルマクロ、実行ファイル、およびネイティブコードは、Appleシリコン搭載のMacでのみキャッシュされます。キャッシュキーはチェックアウトパスとツールチェーンパスをプレースホルダーに置き換えるため、同じマシン上の異なるパスにあるチェックアウト間での再利用は可能ですが、マシン間での再利用はできません。

キャッシングの有効化#

Rust プロジェクトのセットアップに従ってプロジェクトを接続し、認証を行ってください。その後、Tuist を介してビルドを実行します。

bash
tuist cargo build --release

対象となるコンパイルではキャッシングが自動的に行われます。追加のキャッシュ設定や有効化フラグは不要です。Tuist は既存のプロジェクトおよびサーバー構成を使用してアカウントのキャッシュエンドポイントを発見し、キャッシュ認証情報を取得します。

mise を使用している場合は、通常の cargo コマンドを引き続き入力できるように Cargo のラッパーを設定してください。

仕組み#

Cargo が開始される前に、Tuist は同じツールチェーン、プロファイル、および構成で以前のビルドによって生成されたレジストリ依存関係と git 依存関係の成果物を復元するため、Cargo はそれらを最新として認識します。再ビルド対象の決定は Cargo が担当します。その後、Cargo が引き続き実行する対象となる各コンパイルについて、Tuist は以下の処理を行います。

  1. ローカルキャッシュ内で一致する成果物があるか確認します。
  2. ローカルミスが発生した場合、Remote Execution API (REAPI) を介して Kura に問い合わせ、欠落しているコンテンツをダウンロードし、復元する前に成果物を検証します。
  3. キャッシュミスが発生した場合、コンパイラーを通常通り実行します。コンパイルが成功すると、成果物をローカルに保存し、許可されている場合は REAPI を介して Kura にアップロードします。リモートキャッシュエントリーは、参照されているすべてのコンテンツが利用可能になってから公開されます。

ローカルビルドと CI ビルドは同じリモートキャッシュプロトコルを使用します。読み取りおよび書き込みアクセスは、Tuist のサーバーが発行したキャッシュ認証情報と、アカウントの キャッシュアップロードポリシーに基づいて付与されます。アカウントは開発者のダウンロードを許可しつつ、アップロードを CI およびアカウントトークンに制限できます。キャッシュへの書き込み権限を持つのは信頼できるコード作成者です。キャッシュされたコンパイラー成果物は実行可能コードであるため、信頼できるマシンとトークンのみに書き込みアクセスを付与してください。

リモート設定に失敗した場合でも、ローカルキャッシングは利用可能です。利用不可、欠落、または破損したキャッシュエントリーがある場合はコンパイルにフォールバックします。アップロードに失敗しても、ビルドが失敗したり、ローカルキャッシュエントリーが破棄されたりすることはありません。

キャッシュ可能なもの#

キャッシュは以下をサポートしています。

  • ライブラリクレート(ワークスペースクレートおよびパスクレート、依存関係を持つクレート、生成ソースを持つクレートを含む)。Tuist はコンパイラーが読み取ったソースに基づいてキーを生成します。
  • Apple silicon Mac では、ソース検査であらかじめキーを生成できないコンパイル(手続き型マクロ、インラインアセンブリ、またはネイティブライブラリを使用するクレート、手続き型マクロ自体、リンク済み実行ファイルなど)。Tuist はそれぞれが読み取るファイル、環境変数、および git describe などの読み取り専用コマンドを記録し、それらに基づいてキーを生成します。
  • Apple silicon Mac では、デフォルトの Apple コンパイラーで実行される C コンパイルを含むビルドスクリプトの実行。ファイル、環境、および読み取ったコマンドが変更されていない場合のみ、実行が復元されます。
  • 警告およびその他の診断情報(キャッシュされたクレートで再度表示されます)。

以下は通常通りビルドされます。

  • Linux 上のビルドスクリプトおよび記録されたコンパイル。
  • ネットワークに接続するビルドスクリプト、Tuist が監視できないプログラムを開始するビルドスクリプト、または出力ディレクトリの外部に書き込むビルドスクリプト。
  • 増分コンパイル、カスタムターゲット、およびサポートされていないコンパイラー引数またはソース入力。
  • メタデータ専用の cargo check 呼び出し。
  • 予期しないコンパイラー出力を生成するコンパイル。

事前に存在するグローバルコンパイラーラッパーがあると、Tuist のコンパイルキャッシュとコンパイラーオブザーバーが無効になります。カスタムワークスペースラッパーもキャッシングをバイパスします。コンパイラーツールの互換性をご覧ください。

キャッシュキーには、パッケージの内容、コンパイラーとツールチェーン、引数、およびビルド環境が含まれます。チェックアウト、ターゲットディレクトリ、Cargo ホーム、およびツールチェーンの場所はプレースホルダーに置き換えられるため、別のパスでのチェックアウトでも同じエントリーを再利用できます。例えば env!("CARGO_MANIFEST_DIR") を通じて自身のパスを出力に埋め込むクレートは、そのパスでのみ再利用されます。認証情報、Tuist のレポート設定、および認識された CI 実行メタデータはエントリーを無効化しません。コンパイル中にこれらの除外された変数を読み取るクレートはキャッシュされません。

再利用の確認#

Cargo はすでに最新の成果物の再ビルドを回避しています。Cargo の既存の成果物ではなく Tuist のキャッシュを試すには、一度ビルドを実行し、Cargo の成果物を削除してから、同じビルドを繰り返します。

bash
tuist cargo build --release
cargo clean
tuist cargo build --release

対象となるライブラリは 2 回目のビルドで復元できます。サポートされていないクレートは依然としてコンパイルされます。Cargo の成果物を削除しても、Tuist の個別のローカルキャッシュは削除されません。これは再利用を確認するものであり、必ずしもリモートダウンロードを意味するわけではありません。ローカルヒットの場合、Kura からの転送は不要です。入力の検証とキャッシュ操作にはオーバーヘッドがかかるため、コンパイルを回避しても小規模なクレートでビルドが高速になるとは限りません。

キャッシュアクティビティの確認#

プロジェクトのダッシュボードで Cargo Cache を開き、ヒット率、記録された転送、レイテンシ、スループット、および最近のビルドを確認してください。ビルドの Cache タブを開いて、個々のタスクの決定と CAS 出力を確認できます。

欠落している測定値はゼロとしてカウントされず、キャッシュヒットが必ずしもリモートダウンロードを意味するわけではありません。詳細については、Rust キャッシュの測定をご覧ください。

トラブルシューティング#

キャッシュ転送とレポートの失敗を確認するために、デバッグ出力を有効にします。

bash
TUIST_DEBUG=1 tuist cargo build --release

デバッグ出力には、コンパイルまたはビルドスクリプトの実行が保存されなかった理由も記載されています。ヒットが表示されない場合は、他のコンパイラーラッパーが優先されていないか、またコンパイラー、フラグ、および環境がキャッシュを生成したビルドと一致しているか確認してください。リモートアップロードの場合は、認証とアカウントのキャッシュアップロードポリシーも確認してください。