【ツール活用|豆知識】モノレポのビルド時間を劇的に短縮する「Turborepo」活用術

1. 導入:なぜTurborepoが必要なのか

大規模なプロジェクトでモノレポ(複数のパッケージを一つのリポジトリで管理する手法)を採用すると、避けて通れないのが「ビルド時間の増大」です。コードを数行変えただけで全パッケージのテストやビルドが走るようでは、開発効率は著しく低下します。Turborepoは、変更があった箇所のみを賢く再ビルドし、さらにタスクを並列実行することで、この待ち時間を最小化します。Vercel社が提供するこのツールは、現代のフロントエンド開発における生産性向上の救世主です。

2. 基礎知識:Turborepoの仕組み

Turborepoを理解する上で重要な概念が「キャッシュ」と「依存関係グラフ」です。
・キャッシュ(Caching):一度実行したビルド結果をハッシュ化して保存します。次回以降、入力(ソースコードなど)に変更がなければ、ビルドをスキップして即座に結果を返します。
・Remote Caching:ローカルだけでなく、クラウド上にキャッシュを共有する機能です。チームメンバーがビルドした結果を別のメンバーやCI環境で再利用できるため、組織全体のビルド時間が劇的に短縮されます。
・依存関係グラフ:パッケージ間の依存関係を自動解析し、「Aが終わってからBを実行する」といった順序を制御しつつ、依存のないタスクを並列で実行します。

3. 実装/解決策:turbo.jsonによるタスク定義

Turborepoの心臓部は、ルート直下に配置する「turbo.json」です。ここでタスクの依存関係(pipeline)を定義します。例えば、「build」タスクを実行する前に、依存しているパッケージの「build」が完了している必要がある、といった設定を記述します。

4. サンプルプログラム:turbo.jsonの設定例

以下は、一般的なモノレポ構成での設定例です。

{
“$schema”: “https://turbo.build/schema.json”,
“pipeline”: {
// buildタスクの設定
“build”: {
// 自身のビルドの前に、依存するパッケージのbuildを完了させる
“dependsOn”: [“^build”],
// キャッシュ対象のディレクトリを指定
“outputs”: [“dist/“, “.next/“]
},
// testタスクの設定
“test”: {
// testはビルドに依存しないため並列実行可能
“dependsOn”: [“^build”],
“outputs”: []
},
// devタスク(永続的なプロセス)の設定
“dev”: {
“cache”: false, // 開発サーバーはキャッシュ不要のため無効化
“persistent”: true
}
}
}

5. 応用・注意点:現場で陥りやすい罠

・キャッシュの汚染:環境変数などを利用する場合、それがキャッシュのハッシュ計算に含まれているか確認してください。環境変数が変更されたのにキャッシュが効き続けると、意図しない古いビルド成果物が生成されるリスクがあります。
・キャッシュの副作用:ビルドプロセスが「純粋な関数」ではない場合(例:ビルド中に外部APIを叩く、時刻によって内容が変わるなど)、キャッシュを利用すると整合性が取れなくなります。ビルドプロセスは、入力ソースコードに対して出力が常に一定になるよう設計しましょう。
・CI環境での活用:GitHub ActionsなどのCI環境で「Remote Caching」を有効にする際は、Vercelのアカウントと連携させるか、セルフホストのストレージを設定してキャッシュを共有させることで、CIの実行時間を数分単位で短縮することが可能です。

コメント

タイトルとURLをコピーしました