はじめに
JavaScript/TypeScriptのモノレポが成長するにつれて、ビルド時間の増大、CIパイプラインの飽和、開発者生産性の低下が課題となります。Vercelが作成したTurborepoは、インテリジェントなキャッシングと並列タスク実行でこれらの課題に対処します。LernaやNxとは異なり、Turborepoはビルドツールではなくタスクランナーに特化し、実際のコンパイルはesbuild、webpack、tscに任せます。
コアアーキテクチャ — キャッシュシステム
Turborepoの最大の特徴はキャッシュです。キャッシュキーはファイル内容、環境変数、依存関係グラフから計算されます。キャッシュはnode_modules/.cache/turboにtar.gz形式で保存され、ヒットまたはミスのライフサイクルがタスクの実行要否を決定します。
{
"pipeline": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**", ".next/**"],
"inputs": ["src/**/*.ts", "src/**/*.tsx"]
}
}
}
inputs設定でキャッシュの粒度を調整できます。--dry-runを使用してキャッシュ動作を検証し、--graphで依存関係グラフを可視化できます。
パイプライン設定によるタスクオーケストレーション
turbo.jsonのpipeline設定がタスクオーケストレーションの中心です。タスク依存関係、出力ディレクトリ、環境変数、永続モードを定義します。
{
"pipeline": {
"build": { "dependsOn": ["^build"], "outputs": ["dist/**"] },
"test": { "dependsOn": ["build"] },
"lint": { "dependsOn": [], "outputs": [] },
"typecheck": { "dependsOn": ["^build"] }
}
}
トポロジカル順序戦略により、依存関係が先にビルドされ、lintやtypecheckのような独立タスクは並列実行されます。修正モードのlintなどキャッシュ不可タスクにはcache: falseを使用します。
リモートキャッシュ
リモートキャッシュにより、チームメンバーやCI間でビルドアーティファクトを共有できます。Vercelリモートキャッシュ、セルフホストのTurbo Server、S3互換バックエンドがサポートされています。
| 機能 | Vercel | セルフホスト | Nx Cloud |
|---|---|---|---|
| セットアップ | 簡単 | 中程度 | 簡単 |
| コスト | 無料枠あり | インフラ費用 | 有料 |
| データ管理 | Vercel管理 | 完全制御 | Nx管理 |
| 認証 | チームトークン | カスタム | 統合トークン |
認証にはTURBO_TOKENとTURBO_TEAM環境変数を使用します。環境ベースのキャッシュ名前空間により、環境間のキャッシュ汚染を防止します。
依存関係グラフの最適化
Turborepoはpackage.jsonの依存関係からDAGを構築し、タスクスケジューリングに使用します。--filter構文で特定パッケージにスコープを絞り、--graphで可視化できます。
turbo run build --filter=@acme/web...
turbo run build --graph --output=graph.html
パッケージ間依存関係の削減とワークスペースプロトコルの一貫した使用がビルド高速化に貢献します。
移行戦略
Lernaからの移行はlerna runをturbo runに置換し、turbo.jsonを追加するだけです。Nxからの移行ではエグゼキュータをシェルコマンドに変換します。カスタムスクリプトからの移行では並列化機会を特定し、パイプライン化します。50パッケージ以上のモノレポでは、移行後にCI時間が60〜80%削減されるケースが一般的です。
まとめ
Turborepoは高速で正確なモノレポタスクランニングを提供します。npm、pnpm、yarnワークスペースを使用し、本格的なビルドシステムを導入せずにCIを高速化したいチームに最適です。活発なオープンソースコミュニティと、今後のデーモンベースのファイル監視により、長期的な投資価値のあるツールです。
