キャッシュするかしないか
モノレポを構築する際には、以前に実行したタスクに基づいてタスクをスキップできるかどうかを、タスクごとに決定する必要があります。この動作は、turbo.json
内のpipeline.<task>.cache
で制御されます。
{
"$schema": "https://turbo.dokyumento.jp/schema.json",
"pipeline": {
"lint": {
"cache": true
}
}
}
Turborepo のデフォルトは"cache": true
であるため、この値を指定する必要はありません。つまり、これは同一の構成です。
{
"$schema": "https://turbo.dokyumento.jp/schema.json",
"pipeline": {
"lint": {}
}
}
これらの例では、Turborepo にlint
タスクをキャッシュするように指示しました。しかし、cache
キーのみを指定したため、キャッシュされるのはターミナル出力のみです。lint
やtest
などのタスクの種類によっては、この最小限の構成で十分な可能性があります!
しかし、ほとんどのタスクでは、何をキャッシュするかに加えて、キャッシュが有効であるために一致する必要があるファイルと環境変数も指定する必要があります。
キャッシュしない場合
"cache": false
は「常に実行する!」という意味ではありません。「このタスクを実行する必要がある場合、キャッシュから復元されません」という意味です。"cache": false
を頼りに、デプロイなどの副作用をトリガーしないでください。
キャッシングはデフォルトの動作であり、ほとんどの場合に最適であるため、その動作をオプトアウトするタイミングを知ることは重要です。
- 非常に高速に実行されるタスク。リモートキャッシュを使用する予定で、タスクをネットワークラウンドトリップの時間(たとえば、100 ミリ秒)未満で実行できる場合は、タスクをキャッシュしないことを検討する必要があります。
- 出力資産が巨大なタスク。 タスクの実行結果がDockerコンテナの作成である場合、キャッシュアーティファクトの作成、アップロード、ダウンロードにかかる時間が、再生成にかかる時間よりも長くなる可能性があります。
- 変換的でないファイルシステム操作。 タスクが「多数の画像をあるディレクトリから別のディレクトリに移動する」ものである場合、タスクに時間がかかる可能性がありますが、ローカルでこれを行うプロセスは、キャッシュして資産を復元するよりも常に高速です。
- 独自のアプリケーション動作を認識するキャッシュを実装するタスク。 一部のタスクには独自の内部キャッシング動作があります。たとえば、Dockerのレイヤーキャッシュのようなものです。ほとんどの場合、これらのセカンダリキャッシュはTurborepoと連携して機能しますが、場合によっては、その設定が非常に複雑になります。
Turborepoに慣れてくると、これらのガイドラインの一部は、異なる環境で実行する場合に予期しないトレードオフがあることがわかります。たとえば、継続的インテグレーションサービスでのディスク読み込みは、ネットワーク読み込みよりも大幅に遅い場合があります。キャッシュを使用しないことがパフォーマンス上の利点をもたらすかどうかを判断するために、独自のプロジェクトで動作をテストしてください。