Turborepo とは何か? 高速な JavaScript monorepo ツール
Turborepo は JavaScript および TypeScript の monorepo 向けの高性能な build ツールで、タスクの出力を cache し、依存関係に基づいてタスクを並列実行します。
Turborepo は「同じ作業を二度としない」というシンプルな約束で、monorepo の workflow を高速化します。build や test といったタスクの出力を cache し、次の実行では input が変わっていないものについて cache された結果を再生し、残りを並列化します。
Turborepo とは
Turborepo は JS/TS monorepo 向けの build オーケストレーションツールです。タスクの pipeline とその依存関係を turbo.json に定義すると、Turborepo が正しい順序で、可能な限り並列に実行し、再利用のために各タスクの出力を cache します。意図的に軽量で、段階的に導入しやすくなっています。
cache と pipeline
各タスクは自身の input と output を宣言します。Turborepo は input を hash 化し、output を cache に保存します。同じ input が再び現れると、コンソールログを含め、再実行する代わりに cache された出力を復元します。remote cache はこれらの結果をマシン間で共有し、そこから CI の最大の恩恵が生まれます。
config の例
pipeline はタスクの依存関係と output を宣言します。
{
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**"]
}
}
}CI/CD での役割
CI では、Turborepo の remote cache により、input が変わっていない package の再 build と再テストを pipeline がスキップでき、しばしば monorepo のフル build をほぼ瞬時の cache 復元に変えます。まっさらな CI マシンは cold な状態で始まるため、共有された remote cache が恩恵を実現するのに不可欠です。warm な cache を保持するマネージド runner と、一時的な失敗に対する auto-retry が、これらの pipeline を高速かつ信頼できるものに保ちます。
代替ツール
Nx は同様の cache に加え、より豊富な plugin エコシステムとコード生成を提供します。Bazel は、より厳格に、より大規模な多言語リポジトリにスケールします。Lerna は versioning と publish に注力します。Turborepo は、JS/TS monorepo におけるシンプルさ、速度、最小限の設定ゆえに選ばれます。
重要なポイント
- Turborepo は monorepo のタスク出力を cache し、実行を並列化する。
- 変更のない input は、再実行する代わりに cache された結果を復元する。
- CI では、共有された remote cache こそが大きな高速化をもたらす。