
Turborepo
- 55 installs
- 2 repo stars
- Updated August 3, 2026
- fandhe-ai/agent-reference-skills
Helps with ai & agent building tasks.
About
turborepo is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- turborepo
- AI & Agent Building
- AI-coding skill
Turborepo by the numbers
- 55 all-time installs (skills.sh)
- Ranked #6,846 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/fandhe-ai/agent-reference-skills --skill turborepoAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 55 |
|---|---|
| repo stars | ★ 2 |
| Last updated | August 3, 2026 |
| Repository | fandhe-ai/agent-reference-skills ↗ |
What it does
Helps with ai & agent building tasks.
Files
Turborepo リファレンス
Turborepo — JavaScript / TypeScript モノレポ向け高性能ビルドシステム。 turbo.json の設定、タスク管理、キャッシュ、各種ツール統合時に参照する。
ディレクトリ構成
skills/turborepo/
SKILL.md
references/
getting-started/
README.md
installation.md
add-to-existing.md
core-concepts/
README.md
package-and-task-graph.md
package-types.md
remote-caching.md
crafting-your-repository/
README.md
structuring.md
dependencies.md
internal-packages.md
tasks.md
running-tasks.md
caching.md
environment-variables.md
developing.md
ci.md
upgrading.md
understanding-your-repository.md
guides/
README.md
ai.md
generating-code.md
handling-platforms.md
microfrontends.md
migrating-from-nx.md
multi-language.md
publishing-libraries.md
single-package-workspaces.md
skipping-tasks.md
guides-frameworks/
README.md
framework-bindings.md
nextjs.md
nuxt.md
sveltekit.md
vite.md
guides-ci-vendors/
README.md
buildkite.md
circleci.md
github-actions.md
gitlab-ci.md
travis-ci.md
vercel.md
guides-tools/
README.md
biome.md
docker.md
eslint.md
jest.md
oxc.md
playwright.md
prisma.md
shadcn-ui.md
storybook.md
tailwind.md
typescript.md
vitest.md
configuration/
README.md
globs.md
package-configurations.md
system-environment-variables.md
turbo-json.md
cli/
README.md
boundaries.md
gen.md
other-commands.md
prune.md
query.md
run.md
watch.md
samples/
README.md
ci-github-actions.md
code-generation.md
dev-workflow.md
environment-variables.md
filtering-tasks.md
internal-packages.md
monorepo-setup.md
publishing-packages.md
remote-caching.md
task-pipeline.md
scripts/
README.md
build-deploy.md
cache.md
cli.md
dev.md
generate.md
inspect.md
install.md
migrate.md探索手順
タスクからカテゴリを引き、カテゴリの README.md で目的のページを特定する:
1. 下記マッピング表でタスクに対応するカテゴリを探す 2. そのカテゴリの references/{category}/README.md を参照して目的のページを特定する 3. 該当ページの .md を Read して詳細を確認する
タスク → カテゴリ マッピング
| タスク | カテゴリ | 参照 README |
|---|---|---|
| インストール、既存リポジトリへの導入、create-turbo | getting-started | references/getting-started/README.md |
| パッケージグラフ、タスクグラフ、DAG、パッケージタイプ、Remote Caching の概念 | core-concepts | references/core-concepts/README.md |
| リポジトリ構造、依存管理、内部パッケージ、タスク設定・実行、キャッシュ、環境変数、開発・Watch モード、CI 構築、バージョンアップ | crafting-your-repository | references/crafting-your-repository/README.md |
| コード生成、タスクスキップ、ライブラリ公開、単一パッケージ、多言語、マイクロフロントエンド、Nx 移行、AI 連携 | guides | references/guides/README.md |
| Next.js、Nuxt、SvelteKit、Vite、フレームワークバインディング | guides-frameworks | references/guides-frameworks/README.md |
| GitHub Actions、Vercel、GitLab CI、CircleCI、Buildkite、Travis CI | guides-ci-vendors | references/guides-ci-vendors/README.md |
| TypeScript、ESLint、Biome、Oxc、Tailwind CSS、Jest、Vitest、Playwright、Storybook、Prisma、Docker、shadcn/ui | guides-tools | references/guides-tools/README.md |
| turbo.json 設定、パッケージ設定 (extends)、システム環境変数 (TURBO_*)、グロブ仕様 | configuration | references/configuration/README.md |
| turbo run、turbo watch、turbo gen、turbo prune、turbo query、turbo boundaries、その他 CLI コマンド | cli | references/cli/README.md |
| モノレポセットアップ、タスクパイプライン、フィルタリング、Remote Cache、内部パッケージの典型的な使い方 | samples | samples/README.md |
| インストール・CLI コマンド、ビルド・デプロイ、キャッシュ管理、コード生成、開発サーバー、構造検査、移行 | scripts | scripts/README.md |
turbo boundaries
ワークスペース間の依存関係違反を検査する実験的機能。
turbo boundaries検出する違反
1. パッケージディレクトリ外のファイルインポート 2. package.json の dependencies に未宣言のパッケージのインポート
タグ設定
各パッケージの turbo.json でタグを付与:
{ "tags": ["internal"] }ルール設定(ルートの turbo.json)
allow ルール
{
"boundaries": {
"tags": {
"public": { "dependencies": { "allow": ["public"] } }
}
}
}deny ルール
{
"boundaries": {
"tags": {
"public": { "dependencies": { "deny": ["internal"] } }
}
}
}dependents ルール
{
"boundaries": {
"tags": {
"private": { "dependents": { "deny": ["public"] } }
}
}
}ルールは依存チェーンを通じて推移的に適用される。パッケージ名も使用可能。
turbo gen
turbo gen [subcommand] [options]エイリアス: turbo generate
turbo gen workspace
turbo gen workspace [options]| オプション | 説明 |
|---|---|
--name | ワークスペースの名前 |
--empty | 空のワークスペースを作成(デフォルト: true) |
--copy | 既存ワークスペースまたは GitHub リポジトリをコピー |
--destination | 作成先のパス |
--type | app または package |
--show-all-dependencies | 依存関係選択時のワークスペースタイプフィルタを解除 |
--example-path / -p | GitHub URL のブランチ名とサンプルパスを分離 |
turbo gen run
turbo gen run [generator-name] [options]| オプション | 説明 |
|---|---|
--args | ジェネレーターのプロンプトに直接渡す回答 |
--config | ジェネレーター設定ファイル(デフォルト: turbo/generators/config.js) |
--root | リポジトリルートのパス |
@turbo/gen の型定義
import type { PlopTypes } from "@turbo/gen";
export default function generator(plop: PlopTypes.NodePlopAPI): void {
plop.setGenerator("name", {
description: "description",
prompts: [],
actions: [],
});
}その他のコマンド
turbo ls
turbo ls [package(s)] [flags]| オプション | 説明 |
|---|---|
--affected | 影響を受けるパッケージのみ |
--output | pretty または json |
turbo scan
非推奨: turbo scan は将来のメジャーバージョンで削除予定。実行すると非推奨警告が表示される。パフォーマンス最適化を設定するインタラクティブコマンド。Git FS Monitor、Remote Caching、バージョンチェック等を設定。
turbo info
デバッグ情報を表示(バージョン、パス、デーモン状態、パッケージマネージャー、プラットフォーム詳細)。
turbo devtools
パッケージグラフをブラウザで可視化。
| オプション | デフォルト | 説明 |
|---|---|---|
--port | 9876 | サーバーポート |
--no-open | — | ブラウザ自動起動を無効化 |
turbo login / logout / link / unlink
turbo login # Vercel 認証(デフォルトプロバイダー)
turbo login --manual # マニュアルトークン入力
turbo login --api=https://acme.com/api # カスタム API エンドポイント
turbo login --sso-team=slug # SSO チームでログイン
turbo logout # Remote Cache プロバイダーからログアウト
turbo link # リモートキャッシュにリンク
turbo link --yes # 確認プロンプトをスキップ
turbo link --scope=your-team # スコープ(Vercel ではチームスラッグ)
turbo unlink # リンク解除create-turbo
npx create-turbo@latest [options]| フラグ | 説明 |
|---|---|
-m, --package-manager | パッケージマネージャーを指定 |
-e, --example | テンプレートまたは GitHub URL |
--skip-install | 依存関係のインストールをスキップ |
--turbo-version | 特定の turbo バージョンをインストール |
eslint-config-turbo / eslint-plugin-turbo
turbo.json のハッシュ設定に宣言されていない環境変数をコード内で検出する。
ルール: turbo/no-undeclared-env-vars
{
"rules": {
"turbo/no-undeclared-env-vars": ["error", { "allowList": ["^ENV_[A-Z]+$"] }]
}
}turbo telemetry
匿名使用データの収集を管理する。
turbo telemetry status # 現在のテレメトリ設定を確認
turbo telemetry enable # テレメトリを有効化
turbo telemetry disable # テレメトリを無効化turbo bin
turbo 実行バイナリのファイルシステムパスを取得する。グローバルインストールかローカルインストールかの確認に使用。
turbo binturbo docs
ターミナルから Turborepo ドキュメントを検索する(最低バージョン: 2.7.5)。
turbo docs "caching" # キーワード検索
turbo docs "task dependencies" --docs-version 2.8.0 # 特定バージョンのドキュメントを検索@turbo/codemod
npx @turbo/codemod migrate非推奨機能の自動移行。--dry でプレビュー可能。
turbo-ignore(非推奨)
非推奨:turbo-ignoreは更新を終了。代わりにturbo query affectedを使用する。turbo query affectedはタスクレベルの変更検知で精度が高い。
turbo prune
特定パッケージとその依存関係のみを含む部分的なモノレポを生成する。Docker デプロイのレイヤーキャッシュ最適化に有用。
turbo prune [package] [options]オプション
| オプション | デフォルト | 説明 |
|---|---|---|
--docker | false | Docker レイヤーキャッシュ最適化向け出力構造 |
--out-dir | ./out | 出力ディレクトリのパス |
--use-gitignore | true | .gitignore を考慮 |
--docker フラグの出力構造
out/
├── json/ # package.json のみ(依存インストール用)
├── full/ # 完全なソースコード(ビルド用)
└── pnpm-lock.yaml # プルーニング済みロックファイルDockerfile での使用例
FROM node:alpine AS installer
COPY out/json/ .
RUN npm install
FROM node:alpine AS builder
COPY --from=installer /app/node_modules ./node_modules
COPY out/full/ .
RUN turbo run build注意点
pnpm deployと異なり、モノレポ構造を維持globalDependenciesで参照されるファイルはデフォルトではコピーされない
turbo query
モノレポに対して GraphQL クエリを実行し、パッケージ依存関係やタスク関係を分析する。
turbo query [query|file.gql]使用方法
turbo query # インタラクティブモード
turbo query "query { packages { items { name } } }" # 直接実行
turbo query query.gql # ファイルからオプション
| オプション | 説明 |
|---|---|
--schema | GraphQL スキーマを出力 |
--variables / -V | クエリ変数の JSON ファイルパス |
--filter / -F | pnpm スタイルのセレクターでパッケージを絞り込む |
--output | 出力形式(json または pretty) |
turbo query ls
パッケージ一覧表示のショートハンド。
turbo query ls # 全パッケージ
turbo query ls web # 特定パッケージの詳細
turbo query ls --affected # 変更のあるパッケージのみ
turbo query ls --filter=web... --output jsonturbo query affected
変更の影響を受けるパッケージ・タスクを特定する。
turbo query affected [flags]| フラグ | 説明 |
|---|---|
--tasks [names] | タスク名でフィルタ |
--packages [names] | パッケージ名でフィルタ |
--base [ref] | 比較ベースの Git ref |
--head [ref] | 比較対象 HEAD(デフォルト: HEAD) |
--exit-code | 変更あり: 1、なし: 0、エラー: 2 |
cli
| Name | Description | Path |
|---|---|---|
| turbo boundaries | ワークスペース間の依存関係違反を検査する実験的機能。 | boundaries.md |
| turbo gen | エイリアス: turbo generate | gen.md |
| その他のコマンド | turbo ls のパッケージ一覧表示。 | other-commands.md |
| turbo prune | 特定パッケージとその依存関係のみを含む部分的なモノレポを生成する。 | prune.md |
| turbo query | モノレポに対して GraphQL クエリを実行し、パッケージ依存関係やタスク関係を分析する。 | query.md |
| turbo run | turbo run <task> [options] | run.md |
| turbo watch | コードの変更をもとにタスクを再実行する。 | watch.md |
turbo run
turbo run <task> [options]主要オプション
フィルタリング
| オプション | 説明 |
|---|---|
--filter <pattern> / -F | 実行対象パッケージを絞り込む |
--affected | 変更があったパッケージのみ実行 |
--only | 依存タスクを実行せず指定タスクのみ |
キャッシュ制御
| オプション | デフォルト | 説明 |
|---|---|---|
--cache | local:rw,remote:rw | キャッシュの読み書きモード |
--force | — | キャッシュを無視して再実行 |
--cache-dir | .turbo/cache | キャッシュディレクトリ |
実行制御
| オプション | デフォルト | 説明 |
|---|---|---|
--concurrency | 10 | 最大同時実行数 |
--continue | never | エラー時の動作(never/dependencies-successful/always) |
--env-mode | strict | 環境変数のアクセス制御 |
出力・デバッグ
| オプション | 説明 |
|---|---|
--dry / --dry-run | 実行せずにタスク計画を表示 |
--graph | タスクグラフを可視化(dot/svg/html/mermaid) |
--json | 人間可読テキストの代わりに NDJSON を stdout へ出力 |
--log-file | 構造化 JSON ログをファイルに書き込む |
--output-logs | ログ出力レベル |
--log-order | ログ順序(stream/grouped/auto、デフォルト: auto) |
--log-prefix | ログプレフィックス制御(task/none/auto、デフォルト: auto) |
--summarize | 実行メタデータを JSON で出力 |
--profile | パフォーマンストレースを生成 |
--anon-profile | 機密情報を除外したプロファイルを生成 |
--framework-inference | フレームワーク推論の有効/無効(デフォルト: true) |
--verbosity / -v | ログレベル(-v=Info, -vv=Debug, -vvv=Trace) |
フィルタ構文
パッケージ名
turbo run build --filter=ui
turbo run build --filter=@acme/uiディレクトリ
turbo run build --filter=./apps/*Git ベース
turbo run build --filter=[HEAD^1]
turbo run build --filter=[origin/main]マイクロシンタックス演算子
| 演算子 | 意味 |
|---|---|
! | 除外 |
...pkg | pkg の依存元(上流)を含む |
pkg... | pkg の依存先(下流)を含む |
^ | ... 使用時に対象自身を除外 |
よく使う組み合わせ
turbo run build --affected # 変更パッケージのみ
turbo run build --dry=json # ドライラン
turbo run test --continue=always # エラーでも続行
turbo run build --cache=local:r,remote:rw # ローカル読み込みのみ
turbo run test --filter=...@acme/ui # 依存元すべて
turbo run web#lint # 特定タスクturbo watch
turbo watch [tasks]コードの変更をもとにタスクを再実行する。
動作レベル
- デフォルト: パッケージレベル。ファイルが1つでも変わると全タスク再実行
- `futureFlags.watchUsingTaskInputs` 有効化: タスクの
inputsグロブに基づいてフィルタリング
persistent タスクとの関係
| ケース | 推奨 |
|---|---|
組み込みウォッチャー付き(next dev 等) | "persistent": true でマークし turbo watch は使わない |
| モノレポ非対応のウォッチャー | "interruptible": true でマークし、変更検知時に再起動 |
persistent タスクは turbo watch に無視される。
制限事項
- キャッシュ: 現在実験的(
--experimental-write-cacheで使用可能) - ソース管理下のファイルへ書き込むタスクは無限ループの恐れあり
ファイルグロブ仕様
基本パターン
| パターン | 説明 |
|---|---|
* | 単一ディレクトリレベル内の全ファイル |
** | 全ネストディレクトリを再帰的にマッチ |
some-dir/ | ディレクトリ自体と配下全コンテンツ |
some-dir | その名前のファイルまたはディレクトリ(再帰マッチ) |
*.js | 現在のレベルで指定拡張子のファイル |
! | グロブ全体を否定 |
実用例
dist/** # dist 配下の全ファイル
dist/ # dist ディレクトリとその中身すべて
!dist # dist ディレクトリを完全に除外
dist/*.js # dist 直下の JS ファイルのみ
dist/**/*.js # dist 配下の任意の深さの JS ファイル
../scripts/** # 1つ上の scripts ディレクトリ内のファイル否定パターン
! による否定は末尾に /** が自動付与され、ディレクトリツリー全体の除外が簡略化される。
パッケージ固有 turbo.json
extends
ルートの turbo.json 設定を継承する。パッケージレベルの turbo.json にのみ使用。
{
"extends": ["//"],
"tasks": {
"build": {
"outputs": ["dist/**"]
}
}
}"extends": ["//"] はルートワークスペースを意味する。
パッケージレベルでのオーバーライド
パッケージの turbo.json ではルートの同名タスクの設定を上書きできる:
outputs,inputs,env,passThroughEnvは上書きdependsOnはルート設定とマージ
使用例
apps/web/turbo.json ← Next.js 用の outputs を定義
packages/ui/turbo.json ← UI ライブラリ用の outputs を定義Configuration
| Name | Description | Path |
|---|---|---|
| ファイルグロブ仕様 | 単一ディレクトリレベル内の全ファイル、再帰マッチなどの仕様 | globs.md |
| パッケージ固有 turbo.json | ルートの turbo.json 設定を継承するパッケージレベル設定 | package-configurations.md |
| システム環境変数 | 設定系・CI/プラットフォーム系・キャッシュ・認証・ログ出力の環境変数 | system-environment-variables.md |
| turbo.json 設定 | グローバル設定、タスク定義、futureFlags の主要オプション | turbo-json.md |
システム環境変数
設定系
| 変数名 | 説明 |
|---|---|
TURBO_API | Remote Cache サービスのベース URL |
TURBO_BINARY_PATH | turbo バイナリの場所を手動指定 |
TURBO_CACHE | キャッシュの読み書き権限を制御 |
TURBO_CACHE_DIR | キャッシュ保存ディレクトリ |
TURBO_CACHE_MAX_AGE | キャッシュエントリの最大保持期間(例: 7d, 24h) |
TURBO_CACHE_MAX_SIZE | ローカルキャッシュの最大サイズ(超えると古いものから削除) |
FORCE_COLOR | ターミナルログに強制的に色を表示 |
CI / プラットフォーム系
| 変数名 | 説明 |
|---|---|
TURBO_CI_VENDOR_ENV_KEY | Framework Inference から除外する環境変数プレフィックス |
TURBO_PLATFORM_ENV | CI 環境で設定された環境変数キーの CSV |
TURBO_PLATFORM_ENV_DISABLED | プラットフォーム設定の照合を無効化 |
キャッシュ・パフォーマンス系
| 変数名 | 説明 |
|---|---|
TURBO_FORCE | キャッシュをバイパスしてタスクを再実行 |
TURBO_REMOTE_ONLY | ローカルキャッシュを無視 |
TURBO_REMOTE_CACHE_READ_ONLY | Remote Cache の読み取りのみ許可 |
TURBO_REMOTE_CACHE_SIGNATURE_KEY | アーティファクトの署名キー |
TURBO_REMOTE_CACHE_TIMEOUT | ダウンロードタイムアウト(秒) |
TURBO_REMOTE_CACHE_UPLOAD_TIMEOUT | アップロードタイムアウト(秒) |
TURBO_PREFLIGHT | プリフライトリクエストを有効化 |
認証系
| 変数名 | 説明 |
|---|---|
TURBO_TOKEN | Remote Cache アクセスのベアラートークン |
TURBO_TEAM | アカウント/チームのスラッグ |
TURBO_TEAMID | アカウント ID |
TURBO_LOGIN | Remote Cache サービスのログイン URL |
ログ・UI 系
| 変数名 | 説明 |
|---|---|
TURBO_LOG_FILE | 構造化 JSON ログの出力先ファイル |
TURBO_LOG_ORDER | grouped / default |
TURBO_PRINT_VERSION_DISABLED | 実行時のバージョン出力を抑制 |
TURBO_UI | TUI の有効/無効 |
TURBO_RUN_SUMMARY | Run Summary レポート生成 |
TURBO_CONCURRENCY | 並列実行数 |
ソース管理系
| 変数名 | 説明 |
|---|---|
TURBO_SCM_BASE | --affected のベースリファレンス |
TURBO_SCM_HEAD | --affected のヘッドリファレンス |
タスク実行時に自動提供される変数
| 変数名 | 説明 |
|---|---|
TURBO_HASH | 現在実行中のタスクのハッシュ値 |
TURBO_IS_TUI | TUI 使用時に true |
TURBO_IS_MFE | microfrontends.json 使用時にポートがセット |
その他
| 変数名 | 説明 |
|---|---|
TURBO_DANGEROUSLY_DISABLE_PACKAGE_MANAGER_CHECK | packageManager 検証を無効化 |
TURBO_DOWNLOAD_LOCAL_ENABLED | 正しいローカルバージョンのインストールを許可 |
TURBO_GLOBAL_WARNING_DISABLED | ローカルバージョン未検出時の警告を抑制 |
TURBO_NO_UPDATE_NOTIFIER | 更新通知を非表示 |
TURBO_TELEMETRY_MESSAGE_DISABLED | テレメトリ通知を抑制 |
TURBO_SSO_LOGIN_CALLBACK_PORT | SSO コールバックポート(デフォルト: 9789) |
turbo.json 設定
グローバル設定
| キー | デフォルト | 説明 |
|---|---|---|
extends | — | ルート turbo.json から拡張(パッケージ固有設定用) |
globalDependencies | [] | 全タスクのハッシュに含めるファイルのグロブ |
globalEnv | [] | 全タスクのハッシュに影響する環境変数 |
globalPassThroughEnv | [] | 全タスクで利用可能にする環境変数(ハッシュ影響なし) |
ui | "stream" | "tui" または "stream" |
cacheDir | ".turbo/cache" | キャッシュ保存場所 |
cacheMaxAge | "0" | キャッシュ最大保持期間(例: "7d", "24h") |
cacheMaxSize | "0" | キャッシュ最大サイズ(例: "10GB", "500MB") |
envMode | "strict" | "strict" または "loose" |
concurrency | "10" | 並列実行の最大タスク数 |
noUpdateNotifier | false | アップデート通知を無効化 |
dangerouslyDisablePackageManagerCheck | false | packageManager 検証を無効化 |
futureFlags | — | 将来デフォルト化される実験的機能を有効化 |
tags | — | Boundaries で使用するパッケージタグ(パッケージ設定のみ) |
global | — | グローバルオプションの名前空間(globalConfiguration フラグ必須) |
remoteCache | — | Remote Cache 設定 |
experimentalObservability | — | OpenTelemetry メトリクス出力設定 |
boundaries | — | turbo boundaries コマンドのルール設定 |
tasks | — | タスク定義 |
futureFlags
| フラグ | デフォルト | 説明 |
|---|---|---|
errorsOnlyShowHash | false | outputLogs: "errors-only" 時にタスクハッシュを表示 |
longerSignatureKey | false | Remote Cache 署名キーを 32 バイト以上に制限 |
affectedUsingTaskInputs | false | --affected でタスクレベルの inputs を使用 |
watchUsingTaskInputs | false | turbo watch でタスクの inputs グロブでフィルタリング |
pruneIncludesGlobalFiles | false | turbo prune 出力に globalDependencies ファイルを含める |
filterUsingTasks | false | --filter をパッケージでなくタスクレベルで解決 |
globalConfiguration | false | グローバルオプションを global 名前空間に移動 |
タスク定義(tasks 配下)
| キー | デフォルト | 説明 |
|---|---|---|
dependsOn | [] | タスクの実行依存関係 |
inputs | ソース管理対象全ファイル | ハッシュ対象ファイルのグロブ |
outputs | [] | キャッシュするファイル |
cache | true | キャッシュの有効/無効 |
env | [] | タスクのハッシュに影響する環境変数 |
passThroughEnv | [] | 実行時のみ利用可能な環境変数 |
persistent | false | 長時間実行プロセスに指定 |
interactive | false | stdin 入力を有効にする |
interruptible | false | turbo watch 時の再起動許可 |
outputLogs | "full" | "full" / "hash-only" / "new-only" / "errors-only" / "none" |
with | [] | 並行実行するタスクを指定 |
extends | true | 継承チェーンから設定を引き継ぐ(タスクレベル) |
description | "" | タスクの説明(情報表示のみ) |
inputs の特殊値
$TURBO_DEFAULT$: デフォルト挙動を維持しつつ追加・除外$TURBO_ROOT$: リポジトリルートからの相対パス$TURBO_EXTENDS$: 継承した値に追記
完成例
{
"$schema": "https://turborepo.com/schema.json",
"globalDependencies": [".env"],
"globalEnv": ["NODE_ENV"],
"globalPassThroughEnv": ["CI"],
"tasks": {
"build": {
"dependsOn": ["^build"],
"inputs": ["src/**", "package.json", "tsconfig.json"],
"outputs": ["dist/**"],
"env": ["MY_API_URL"]
},
"test": {
"dependsOn": ["build"],
"inputs": ["src/**", "test/**"]
},
"lint": {},
"dev": {
"dependsOn": ["^build"],
"cache": false,
"persistent": true
}
}
}Package and Task Graph
パッケージグラフ
パッケージマネージャーが作成するモノレポの基盤構造。内部パッケージ同士がインストールされると、Turborepo が自動的に依存関係を識別する。
タスクグラフ
turbo.json で定義するタスク同士の関係。データ構造は有向非巡回グラフ(DAG)。
- ノード = タスク
- エッジ = タスクの依存関係
- Task A → Task B のエッジは「A は B に依存する」を意味する
{
"tasks": {
"build": {
"dependsOn": ["^build"]
}
}
}トランジットノード
タスクの実装を持たないパッケージでも、依存先がそのタスクを持つ場合、タスクグラフに含まれる。ui に build タスクがなくても、ui が依存する core に build タスクがある場合、ui は「トランジットノード」として扱われる(自身では何も実行しないが、グラフ上は存在する)。
"dependsOn": ["^test"] のような設定があれば、build タスクを持たないパッケージでも、依存先のビルドがトリガーされる。
Package Types
Application Packages
ワークスペースから直接デプロイするために設計されたパッケージ。
- 通常
./appsディレクトリに配置 - Next.js、Svelte、Vite、CLI アプリなど
- パッケージグラフの「終端ノード」として機能
- 通常は他のパッケージの依存関係としてインストールしない
Library Packages
ワークスペース全体で共有されるコードを含むパッケージ。
- 単独ではデプロイ不可
- 「Internal Packages」とも呼ばれる
- 公式ドキュメントでは
internal-packagesとして独立ページ化(/docs/core-concepts/internal-packages)
Internal Packages の3つのコンパイル戦略
1. Just-in-Time(JIT)パッケージ
アプリケーションのバンドラーが TypeScript ソースファイルを直接コンパイル。
- 設定が最小限で済む
- ビルドステップ不要
- 制限: トランスパイル可能なコンシューマーでのみ動作、TypeScript の
paths使用不可、Turborepo のビルドキャッシュ不可
2. Compiled Packages
tsc 等でコンパイル。Turborepo がビルド出力をキャッシュ可能。
{
"exports": {
"./add": {
"types": "./dist/add.d.ts",
"default": "./dist/add.js"
}
}
}3. Publishable Packages
npm レジストリへの配布を準備したパッケージ。changesets の使用を推奨。
インストール構文
| パッケージマネージャー | 構文 |
|---|---|
| pnpm / bun | "@repo/ui": "workspace:*" |
| yarn / npm | "@repo/ui": "*" |
Core Concepts
| Name | Description | Path |
|---|---|---|
| Package and Task Graph | パッケージマネージャーが作成するモノレポの基盤構造。内部パッケージ同士が… | package-and-task-graph.md |
| Package Types | ワークスペースから直接デプロイするために設計されたパッケージ。 | package-types.md |
| Remote Caching | タスクのキャッシュアーティファクトをマシンや CI システム間で共有する機能。 | remote-caching.md |
Remote Caching
概要
タスクのキャッシュアーティファクトをマシンや CI システム間で共有する機能。入力が同一の場合、重複作業を防止する。
解決する問題
標準の Turborepo キャッシュはローカルに存在するため、開発者・チームメンバー・CI システムがそれぞれ別々に同じタスクを再実行してしまう。
実装オプション
| オプション | 説明 |
|---|---|
| Vercel Remote Cache(マネージド) | 全プランで無料。Vercel 上でアプリをホストしていなくても利用可能 |
| セルフホスト | Turborepo の API 仕様を満たす任意の HTTP サーバーで独自実装 |
セットアップ手順
# Step 1: 認証
turbo login
# SSO の場合
npx turbo login --sso-team=team-name
# Step 2: リンク
turbo link
# Step 3: 動作確認
rm -rf ./.turbo/cache
turbo run buildアーティファクト署名検証
HMAC-SHA256 署名による検証をサポート。
{
"remoteCache": {
"signature": true
}
}環境変数 TURBO_REMOTE_CACHE_SIGNATURE_KEY に秘密鍵を設定する。
キャッシュ
ハッシュ計算の仕組み
タスクごとに2種類のハッシュを計算し、両方が一致するときのみキャッシュヒット。
グローバルハッシュ(全タスク共通)
- turbo.json 設定変更
- ルートの package.json ロックファイル更新
globalDependenciesのファイル内容変更globalEnvの環境変数値変更--以降の passthrough 引数
パッケージハッシュ(タスク個別)
- パッケージ固有の turbo.json 変更
- パッケージの package.json 変更
- ファイルの変更(デフォルト: 全ファイル。
inputsで設定可能)
キャッシュされる内容
outputsに定義したファイル/ディレクトリ- ターミナルログ(常にキャッシュ)
キャッシュ制御
| 方法 | 説明 |
|---|---|
"cache": false | 特定タスクのキャッシュを永続的に無効化 |
--force | キャッシュを読まずに再実行 |
--cache フラグ | local/remote の読み書きを細かく制御 |
--summarize | ハッシュのデバッグ用レポートを生成 |
デバッグ
turbo build --dry # 実行せずにタスク計画を確認
turbo build --summarize # 入出力の詳細サマリーを JSON で生成Git Worktree のキャッシュ共有
メインのワークツリーとリンクされたワークツリー間でローカルキャッシュを自動共有。cacheDir を明示的に指定するとこの機能は無効。
キャッシュが効果を発揮しにくいケース
- タスクの実行速度がネットワーク遅延より速い
- 出力アーティファクトが非常に大きい
- スクリプト自体が内部キャッシュ機構を持っている
CI の構築
環境変数
| 変数 | 用途 |
|---|---|
TURBO_TOKEN | Remote Cache へのアクセストークン |
TURBO_TEAM | リポジトリのアカウント名(Vercel チームスラッグ) |
影響を受けるパッケージのみ実行
# シンプルな方法
turbo run build --affected
# JSON で影響パッケージを確認
turbo query affected --packages web
# バイナリチェック(変更あり: 終了コード 1)
turbo query affected --packages web --exit-code典型的なワークフロー
# 品質チェックは全パッケージで
turbo run lint check-types test
# ビルドは特定パッケージのみ
turbo build --filter=web注意点
- シャロークローンの制限: Git 履歴がない場合、ソース管理変更によるフィルタリングは使えない
- GitHub Actions の自動検出: PR の base/head ブランチ間の差分を自動検出
- グローバル
turboのバージョン固定を推奨 turbo run <task>を明示的に使う(将来のサブコマンドとの名前衝突防止)outputs、env、globalEnvを正しく設定しないとキャッシュミスやビルド失敗が発生
依存関係の管理
内部パッケージの依存宣言
pnpm / bun: "@repo/ui": "workspace:*" npm / yarn: "@repo/ui": "*"
複数パッケージへの一括インストール
# pnpm
pnpm add jest --save-dev --recursive --filter=web --filter=@repo/ui
# npm
npm install jest --workspace=web --workspace=@repo/ui --save-dev
# yarn (2+)
yarn workspaces foreach -R --from '{web,@repo/ui}' add jest --devベストプラクティス
- 使う場所にインストール: 依存関係は使用するパッケージの
package.jsonに直接書く - ルートには管理ツールのみ: turbo / husky / lint-staged 等
- Turborepo は依存関係の管理自体には関与しない(パッケージマネージャーの仕事)
バージョン統一ツール
syncpack,manypkg,sherif等の専用ツール- pnpm v9.5+ の catalogs 機能
アプリケーション開発
dev タスク設定
{
"tasks": {
"dev": {
"cache": false,
"persistent": true
}
}
}"cache": false: 頻繁に変化する開発コードにはキャッシュ不要"persistent": true: 終了しないタスクに誤って依存するのを防ぐ
セットアップスクリプト付き dev
{
"tasks": {
"dev": {
"cache": false,
"persistent": true,
"dependsOn": ["//#dev:setup"]
},
"//#dev:setup": {
"outputs": [".codegen/**"]
}
}
}コマンド
turbo dev # 全 dev タスクを実行
turbo dev --filter=web # web とその依存パッケージのみ
turbo watch dev lint # ウォッチモードターミナル UI キーバインド
| キー | 機能 |
|---|---|
m | キーバインドメニューの表示切替 |
↑/↓ or j/k | タスクリストのナビゲーション |
p | 選択タスクのピン留め切替 |
h | タスクリストの表示切替 |
c | ハイライトされたログをコピー |
u/d | ログのスクロール上下 |
i | タスクとのインタラクション開始 |
Ctrl+z | インタラクションの停止 |
Watch Mode
turbo watch はパッケージ A を変更すると、それに依存するパッケージ B のタスクも自動的に再実行する。
制限事項
ティアダウンタスク: Turborepo はティアダウンスクリプトを自動実行できない。turbo dev:teardown で手動実行する。
環境変数の使用
4種類のキーの違い
| キー | スコープ | ハッシュ影響 | 用途 |
|---|---|---|---|
env | タスク個別 | あり | ビルド出力に影響する変数 |
globalEnv | 全タスク | あり | リポジトリ全体に影響する変数 |
passThroughEnv | タスク個別 | なし | 実行には必要だが出力に影響しない変数 |
globalPassThroughEnv | 全タスク | なし | リポジトリ全体で実行時に必要な変数 |
設定例
{
"globalEnv": ["NODE_ENV"],
"globalPassThroughEnv": ["AWS_ACCESS_KEY_ID"],
"tasks": {
"build": {
"env": ["MY_API_URL", "MY_API_KEY"],
"passThroughEnv": ["CI"]
}
}
}Strict Mode vs Loose Mode
strict(デフォルト): 宣言されていない環境変数はタスクに渡されないloose: プロセスの全環境変数がタスクに渡される
フレームワーク自動推論
Next.js の NEXT_PUBLIC_*、Vite の VITE_* 等は自動的にハッシュに含まれる。
無効化: turbo build --framework-inference=false
.env ファイルの扱い
Turborepo は .env ファイルを自動ロードしない。inputs に追加してハッシュに含める:
{
"globalDependencies": [".env"],
"tasks": {
"build": {
"inputs": ["$TURBO_DEFAULT$", ".env*"]
}
}
}ベストプラクティス
.envファイルはルートではなくアプリパッケージに置くeslint-config-turboでハッシュに含まれていない変数を検出- トラブルシューティング:
turbo build --summarize
内部パッケージの作成
1パッケージ1責務の設計が推奨。
作成手順
1. ディレクトリを作成
packages/math/
src/
add.ts
subtract.ts
package.json
tsconfig.json2. package.json
{
"name": "@repo/math",
"type": "module",
"exports": {
"./add": { "types": "./dist/add.d.ts", "default": "./dist/add.js" },
"./subtract": { "types": "./dist/subtract.d.ts", "default": "./dist/subtract.js" }
},
"scripts": {
"dev": "tsc --watch",
"build": "tsc"
},
"devDependencies": {
"typescript": "latest",
"@repo/typescript-config": "workspace:*"
}
}3. tsconfig.json
{
"extends": "@repo/typescript-config/base.json",
"compilerOptions": { "outDir": "dist", "rootDir": "src" },
"include": ["src"],
"exclude": ["node_modules", "dist"]
}include / exclude はベース設定から継承されないので必ず明記する。
4. アプリへの組み込み
{ "dependencies": { "@repo/math": "workspace:*" } }5. キャッシュ設定
{
"tasks": {
"build": {
"outputs": [".next/**", "!.next/cache/**", "dist/**"]
}
}
}Crafting Your Repository
| Name | Description | Path |
|---|---|---|
| キャッシュ | タスクごとに2種類のハッシュを計算し、両方が一致するときのみキャッシュヒット。 | caching.md |
| CI の構築 | 環境変数と影響パッケージフィルタリング、リモートキャッシュの設定。 | ci.md |
| 依存関係の管理 | ワークスペース内の内部パッケージ依存宣言と一括インストール手法。 | dependencies.md |
| アプリケーション開発 | dev タスク設定、キャッシュ無効化、ウォッチモード、UI キーバインド。 | developing.md |
| 環境変数の使用 | env、globalEnv、passThroughEnv の4種類の違いと自動推論。 | environment-variables.md |
| 内部パッケージの作成 | 1パッケージ1責務設計、package.json、exports 設定。 | internal-packages.md |
| タスクの実行 | package.json スクリプト、複数実行、フィルタリング、ショートハンド構文。 | running-tasks.md |
| リポジトリの構造化 | ディレクトリ構成、ワークスペース定義、exports フィールド。 | structuring.md |
| タスクの設定 | dependsOn、outputs、inputs の設定と特殊値の説明。 | tasks.md |
| リポジトリの把握 | turbo devtools、turbo ls、turbo query GraphQL インターフェース。 | understanding-your-repository.md |
| アップグレード | codemod による自動移行、v2.0 での主な変更点と非推奨フラグ。 | upgrading.md |
タスクの実行
3つの実行方法
1. package.json スクリプト(頻繁に使うタスク) 2. グローバル turbo CLI(オンデマンド) 3. --filter でスコープを絞る
package.json スクリプト
{
"scripts": {
"dev": "turbo run dev",
"build": "turbo run build",
"test": "turbo run test",
"lint": "turbo run lint"
}
}複数タスクの同時実行
turbo run build test lint check-types自動並列化される。
フィルタリング
| フィルター | 例 |
|---|---|
| パッケージ名 | turbo build --filter=@acme/web |
| ディレクトリ | turbo lint --filter="./packages/utilities/*" |
| 依存元を含む | turbo build --filter=...ui |
| 依存先を含む | turbo dev --filter=web... |
| Git 差分 | turbo build --filter=[HEAD^1] |
複数フィルターは OR(和集合)として動作。
ショートハンド構文(v2.2.4+)
turbo run web#build docs#lint注意点
turboコマンドはルートのpackage.jsonにのみ書く(パッケージ内に書くと再帰実行)- タスク実行順序は CLI 引数の順ではなく
turbo.jsonの設定で制御
リポジトリの構造化
推奨ディレクトリ構成
apps/ # アプリケーション・サービス
packages/ # ライブラリ・ツール設定
turbo.json
package.json最低限必要なもの
1. パッケージマネージャーのワークスペース定義 2. ロックファイル 3. ルート package.json 4. ルート turbo.json 5. 各パッケージの package.json
ワークスペース定義
pnpm (pnpm-workspace.yaml):
packages:
- "apps/*"
- "packages/*"npm / yarn / bun (ルート package.json):
{
"workspaces": ["apps/*", "packages/*"]
}exports フィールド
{
"exports": {
".": "./src/constants.ts",
"./add": "./src/add.ts",
"./subtract": "./src/subtract.ts"
}
}バレルファイルを避け、条件付きエクスポートが可能。IDE の自動補完が効く。
制約
- ネストしたパッケージは非対応(
apps/**は不可) - ロックファイル必須
- パッケージ名には名前空間プレフィックス推奨(例:
@acme/name) - パッケージ間を相対パス(
../)でアクセスしない
タスクの設定
dependsOn(依存関係)
^ トポロジカル依存
{ "build": { "dependsOn": ["^build"] } }全依存パッケージの build を先に実行。
同一パッケージ依存
{ "test": { "dependsOn": ["build"] } }同じパッケージ内の build を先に実行。
package#task 構文
{ "lint": { "dependsOn": ["utils#build"] } }特定パッケージの特定タスクへの依存を明示。
依存なし(並列実行)
dependsOn を省略するか空配列にする。
outputs(キャッシュ対象)
{ "build": { "outputs": [".next/**", "!.next/cache/**", "dist/**"] } }outputs を定義しないとファイルキャッシュなし(ログのみ)。
inputs(ハッシュ対象ファイル)
{ "spell-check": { "inputs": ["**/*.md", "**/*.mdx"] } }特殊値:
$TURBO_DEFAULT$: デフォルト挙動を維持しつつ追加・除外$TURBO_ROOT$: リポジトリルートからの相対パス$TURBO_EXTENDS$: 継承した値に追記
ルートタスク
{ "//#lint:root": {} }ワークスペースルートの package.json スクリプトを実行。
cache: false(副作用タスク)
{ "deploy": { "dependsOn": ["^build"], "cache": false } }persistent + with(長時間実行タスク)
{
"dev": {
"with": ["api#dev"],
"persistent": true,
"cache": false
}
}リポジトリの把握
turbo devtools
ブラウザベースのパッケージグラフ可視化ツール。タスクグラフの問題診断に使う。
turbo devtoolsturbo ls
パッケージとそのディレクトリ位置を一覧表示。turbo run と同じフィルタリングオプションが使用できる。
turbo ls
turbo ls --filter ...uiturbo run(引数なし)
タスクを指定せずに turbo run を実行すると、モノレポ内で利用可能な全タスクとそれが定義されているパッケージを表示する。
turbo runturbo query(v2.2.0+)
GraphQL インターフェースでリポジトリを深く調査できる。
使用例
# build タスクを持つパッケージを検索
turbo query "query { packages(filter: { has: { field: TASK_NAME, value: \"build\"}}) { items { name } } }"
# 10以上のパッケージから依存されているパッケージを検索
turbo query "query { packages(filter: { greaterThan: { field: DIRECT_DEPENDENT_COUNT, value: 10 } }) { items { name } } }"
# 直近の変更で影響を受けたパッケージと理由を確認
turbo query "query { affectedPackages(base: \"HEAD^\", head: \"HEAD\") { items { reason { __typename } } } }"主なユースケース
- キャッシュミスの多発パッケージ(頻繁にインポートされるパッケージ)の特定
--affectedフラグ使用時の影響範囲の把握- 肥大化パッケージの分割判断
Related
- running-tasks
- caching
- cli/query
アップグレード
codemod による自動移行
# pnpm
pnpm dlx @turbo/codemod migrate
# yarn
yarn dlx @turbo/codemod migrate
# npm
npx @turbo/codemod migrate
# bun
bunx @turbo/codemod migrateturbo.json の自動更新と、ワークスペース package.json への name フィールド追加を行う。
v2.0 での主な変更点
packageManager フィールドの必須化
ルート package.json に packageManager フィールドを追加する:
{
"packageManager": "pnpm@9.2.0"
}環境変数モードの変更
Strict Mode がデフォルトになった。段階的移行には --env-mode=loose フラグか、turbo.json の envMode キーを使う。
削除されたフラグ
| 削除フラグ | 代替 |
|---|---|
--ignore | --filter |
--scope | --filter |
フィルタリングの変更
- 名前空間の自動推論が削除された
- マッチしないパッケージ指定はエラーになる
--onlyはパッケージ依存ではなくタスク依存を制限するようになった
キャッシュハッシュの変更
ルート package.json の engines フィールドがキャッシュハッシュに含まれるようになった。
eslint-config-turbo の更新
eslint-config-turbo を使用している場合、メジャーバージョンを合わせて更新する。
Related
- configuring-tasks
- environment-variables
既存リポジトリへの追加
対応するリポジトリタイプ
| タイプ | 説明 |
|---|---|
| Single-Package Workspace | create-next-app 等で作成した単一パッケージ。事前準備不要 |
| Multi-Package Workspace(モノレポ) | パッケージマネージャーのワークスペース機能を使った複数パッケージ |
導入手順
Step 1: Turborepo のインストール
pnpm add turbo --global
pnpm add turbo --save-dev --workspace-rootStep 2: turbo.json の作成
{
"$schema": "https://turborepo.dev/schema.json",
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": [".next/**", "!.next/cache/**"]
},
"check-types": {
"dependsOn": ["^check-types"]
},
"dev": {
"persistent": true,
"cache": false
}
}
}Step 3: .gitignore への追加
.turboStep 4: packageManager フィールドの追加
{
"packageManager": "pnpm@10.0.0"
}Step 5: ワークスペース構造の設定(モノレポのみ)
# pnpm-workspace.yaml
packages:
- "apps/*"
- "packages/*"Step 6: タスクの実行
turbo build check-typesキャッシュの効果確認
再実行時の期待される出力:
Cached: 2 cached, 2 total
Time: 185ms >>> FULL TURBOInstallation
新規プロジェクト作成(クイックスタート)
| パッケージマネージャー | コマンド |
|---|---|
| pnpm | pnpm dlx create-turbo@latest |
| yarn | yarn dlx create-turbo@latest |
| npm | npx create-turbo@latest |
| bun | bunx create-turbo@latest |
スターターには2つのアプリケーションと3つの共有ライブラリが含まれる。
グローバルインストール
pnpm add turbo --global
npm install turbo --global用途:
turbo build— 依存グラフに沿ってビルドturbo build --filter=docs --dry— ドライランturbo generate— コード生成cd apps/docs && turbo build— 特定パッケージのビルド
リポジトリへのインストール(devDependency)
npm install turbo --save-devチーム間でバージョンを統一するため、ルートの devDependency にも追加する。
ローカルバージョンへの委譲
グローバルの turbo はリポジトリにローカルバージョンが存在する場合、自動的にそちらに委譲する。ワークフローの利便性を保ちつつチーム全体のバージョン一貫性を維持できる。
getting-started
| Name | Description | Path |
|---|---|---|
| 既存リポジトリへの追加 | 対応するリポジトリタイプと導入手順 | add-to-existing.md |
| Installation | 新規プロジェクト作成とグローバル・ローカルインストール | installation.md |
Buildkite
.buildkite/pipeline.yml 設定例
steps:
- label: ":test_tube: Test"
command: |
npm install
npm test
- label: ":hammer: Build"
command: |
npm install
npm run buildRemote Cache 設定
secrets プラグインで環境変数を注入:
steps:
- label: ":test_tube: Test"
command: |
npm install
npm test
plugins:
- secrets:
variables:
TURBO_TOKEN: TURBO_TOKEN
TURBO_TEAM: TURBO_TEAMCircleCI
重要: CircleCI は TTY を使用するため、`TURBO_UI: "false"` が全 run ステップで必須。
.circleci/config.yml 設定例(pnpm)
version: 2.1
orbs:
node: circleci/node@5.0.2
workflows:
test:
jobs:
- test
jobs:
test:
docker:
- image: cimg/node:lts
steps:
- checkout
- node/install-packages
- run:
command: npm i -g pnpm
environment:
TURBO_UI: "false"
- run:
command: pnpm build
environment:
TURBO_UI: "false"
- run:
command: pnpm test
environment:
TURBO_UI: "false"Remote Cache 設定
CircleCI プロジェクト設定の「環境変数」タブで TURBO_TOKEN と TURBO_TEAM を登録。環境変数は自動でロードされるため CI ファイルの変更は不要。
GitHub Actions
ワークフロー設定例(pnpm)
name: CI
on:
push:
branches: ["main"]
pull_request:
types: [opened, synchronize]
jobs:
build:
name: Build and Test
timeout-minutes: 15
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 2
- uses: pnpm/action-setup@v3
with:
version: 8
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- run: pnpm install
- run: pnpm build
- run: pnpm testRemote Cache 設定
1. Vercel でスコープ付きアクセストークンを作成 2. GitHub Secrets に TURBO_TOKEN を登録 3. GitHub Variables に TURBO_TEAM を登録 4. ワークフロー YAML に環境変数を追加:
env:
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
TURBO_TEAM: ${{ vars.TURBO_TEAM }}actions/cache によるローカルキャッシング
- uses: actions/cache@v4
with:
path: .turbo
key: ${{ runner.os }}-turbo-${{ github.sha }}
restore-keys: |
${{ runner.os }}-turbo-GitLab CI
.gitlab-ci.yml 設定例(pnpm)
image: node:latest
stages:
- build
build:
stage: build
before_script:
- curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm@6.32.2
- pnpm config set store-dir .pnpm-store
script:
- pnpm install
- pnpm build
- pnpm test
cache:
key:
files:
- pnpm-lock.yaml
paths:
- .pnpm-storeRemote Cache 設定
1. Vercel でスコープ付きアクセストークンを作成 2. GitLab「リポジトリ設定 → CI/CD → Variables」で TURBO_TOKEN と TURBO_TEAM を登録
Guides CI Vendors
| Name | Description | Path |
|---|---|---|
| Buildkite | .buildkite/pipeline.yml 設定例。Remote Cache 設定。 | buildkite.md |
| CircleCI | TTY 対応の CI 設定。TURBO_UI: "false" 必須。 | circleci.md |
| GitHub Actions | pnpm 対応ワークフロー例。Remote Cache/actions/cache 設定。 | github-actions.md |
| GitLab CI | .gitlab-ci.yml pnpm 設定例。Remote Cache 統合。 | gitlab-ci.md |
| Travis CI | .travis.yml pnpm キャッシュ設定。Remote Cache 統合。 | travis-ci.md |
| Vercel | ゼロコンフィグ統合。自動的に Turborepo を検出・Remote Cache 構成。 | vercel.md |
Travis CI
.travis.yml 設定例(pnpm)
language: node_js
node_js:
- lts/*
cache:
npm: false
directories:
- "~/.pnpm-store"
before_install:
- curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm@6.32.2
- pnpm config set store-dir ~/.pnpm-store
install:
- pnpm install
script:
- pnpm build
- pnpm testpnpm を使う場合、npm: false でデフォルトの npm キャッシュを無効化し、~/.pnpm-store を別途キャッシュする。
Remote Cache 設定
Travis リポジトリ設定の環境変数セクションで TURBO_TOKEN と TURBO_TEAM を登録。環境変数は自動でロードされるため CI ファイルの変更は不要。
Vercel
Turborepo と Vercel の統合はゼロコンフィグ。Vercel が自動的にモノレポ構造を認識し、Remote Cache も自動で構成される。
デプロイ手順
1. https://vercel.com/new でプロジェクトを新規作成 2. コードをインポート 3. Vercel が自動的に Turborepo を検出し、正しい設定を適用
TURBO_TOKEN / TURBO_TEAM の手動設定は不要。
ライブラリのフレームワークバインディング
ライブラリパッケージ内でフレームワーク API を使う際に、peerDependencies として宣言する手法。
peerDependencies の設定
{
"name": "@repo/ui",
"peerDependencies": {
"next": "*"
}
}消費者側がインストールしたフレームワークのバージョンがライブラリ内でも解決される。バージョンは範囲指定を推奨(例: ">=15")。
実装例
import { ComponentProps } from "react";
import { Link } from "next/link";
type CustomLinkProps = ComponentProps<typeof Link>;
export function CustomLink({ children, ...props }: CustomLinkProps) {
return (
<Link className="text-underline hover:text-green-400" {...props}>
{children}
</Link>
);
}エントリーポイント分割(複数フレームワーク対応)
{
"exports": {
"./link": "./dist/link.js",
"./next-js/link": "./dist/next-js/link.js"
},
"peerDependencies": {
"next": "*"
}
}./link— フレームワーク非依存の汎用 Link./next-js/link— Next.js 専用の Link
Next.js
クイックスタート
pnpm dlx create-turbo@latest # デフォルトテンプレート
pnpm dlx create-next-app@latest apps/my-app # 既存リポジトリに追加内部パッケージの参照
// pnpm / bun
"@repo/ui": "workspace:*"
// yarn / npm
"@repo/ui": "*"タスクのカスタマイズ
デフォルトではルートの turbo.json のタスクが使用される。アプリ固有の設定は Package Configurations で上書き可能。
マイクロフロントエンド設定
// apps/docs/next.config.ts
const nextConfig: NextConfig = {
basePath: "/docs",
};
export default nextConfig;basePath の設定を忘れるとアセットのルーティングが壊れる。
Nuxt
クイックスタート
pnpm dlx create-turbo@latest -e with-vue-nuxt
pnpm dlx nuxi@latest init apps/my-app # 既存リポジトリに追加内部パッケージの参照
// pnpm / bun
"@repo/ui": "workspace:*"
// yarn / npm
"@repo/ui": "*"マイクロフロントエンド設定
Nuxt は内部的に Vite を使用するため、vite.config.ts で base を設定:
export default defineConfig({
base: "/admin",
});guides-frameworks
| Name | Description | Path |
|---|---|---|
| ライブラリのフレームワークバインディング | ライブラリパッケージ内でフレームワーク API を使う際に、peerDependencies として宣言する手法。 | framework-bindings.md |
| Next.js | クイックスタート、内部パッケージの参照、タスクのカスタマイズ、マイクロフロントエンド設定。 | nextjs.md |
| Nuxt | クイックスタート、内部パッケージの参照、マイクロフロントエンド設定。 | nuxt.md |
| SvelteKit | クイックスタート、内部パッケージの参照、マイクロフロントエンド設定。 | sveltekit.md |
| Vite | クイックスタート、内部パッケージの参照、マイクロフロントエンド設定、Module Federation。 | vite.md |
SvelteKit
クイックスタート
pnpm dlx create-turbo@latest -e with-svelte
pnpm dlx sv create apps/my-app # 既存リポジトリに追加内部パッケージの参照
// pnpm / bun
"@repo/ui": "workspace:*"
// yarn / npm
"@repo/ui": "*"マイクロフロントエンド設定
SvelteKit も Vite ベースのため、vite.config.ts で base を設定:
export default defineConfig({
base: "/admin",
});Vite
クイックスタート
pnpm dlx create-turbo@latest -e with-vite内部パッケージの参照
// pnpm / bun
"@repo/ui": "workspace:*"
// yarn / npm
"@repo/ui": "*"マイクロフロントエンド設定
export default defineConfig({
base: "/admin",
});base を設定しないと画像や CSS が正しくルーティングされない。
Module Federation
ランタイムでのモジュール共有には with-vite-module-federation テンプレートを使う:
pnpm dlx create-turbo@latest -e with-vite-module-federation複数の Vite アプリ・パッケージ間で React / Vue / Svelte コンポーネントや依存関係をランタイム共有できる。
Module Federation 使用時の turbo.json 設定:
devタスク:"cache": false、"persistent": true、"dependsOn": ["^build"](共有パッケージのビルドを先に実行)
Biome
高速フォーマッター兼リンター。ルートタスクとして運用が推奨。
設定
{
"scripts": {
"format-and-lint": "biome check .",
"format-and-lint:fix": "biome check . --write"
}
}{
"tasks": {
"//#format-and-lint": {},
"//#format-and-lint:fix": { "cache": false }
}
}注意
ルートタスクのため、バージョンアップや設定変更時に全タスクのキャッシュミスが発生する。
Docker
問題
モノレポでは package-lock.json がリポジトリ全体で共有されるため、無関係な変更が全アプリの再ビルドを引き起こす。
解決策: turbo prune
turbo prune api --docker出力構造:
./out/json— 依存インストール用の package.json のみ./out/full— 完全なソースファイルと設定
Dockerfile 実装例
FROM base AS prepare
RUN yarn global add turbo@^2
RUN turbo prune web --docker
FROM base AS builder
COPY --from=prepare /app/out/json/ .
RUN yarn install
COPY --from=prepare /app/out/full/ .
RUN yarn turbo buildRemote Cache との連携
docker build -f apps/web/Dockerfile . \
--build-arg TURBO_TEAM="your-team-name" \
--build-arg TURBO_TOKEN="your-token" \
--no-cacheESLint
ESLint v9(Flat Config)— 推奨
設定パッケージ構成:
packages/eslint-config/
package.json
base.js
next.js
react-internal.jsESLint プラグインや依存関係を @repo/eslint-config パッケージに一元管理する。
lint タスク設定
{ "tasks": { "lint": { "dependsOn": ["^lint"] } } }^lint により設定パッケージ変更時に依存パッケージのキャッシュが自動無効化される。
注意
ESLint v8 は 2024年10月5日に EOL。新規プロジェクトでは必ず v9 Flat Config を使用する。
Jest
基本設定
{ "scripts": { "test": "jest" } }{ "tasks": { "test": {} } }ウォッチモードの分離(重要)
{
"scripts": { "test": "jest", "test:watch": "jest --watch" }
}{
"tasks": {
"test:watch": { "cache": false, "persistent": true }
}
}VS Code Jest 拡張機能
{
"jest.jestCommandLine": "turbo run test --log-prefix=none --"
}Oxc (oxlint / oxfmt)
Rust 製の超高速 JavaScript / TypeScript ツールスイート。
oxlint
{
"scripts": { "lint": "oxlint .", "lint:fix": "oxlint . --fix" }
}{
"tasks": {
"//#lint": {},
"//#lint:fix": { "cache": false }
}
}oxfmt(アルファ版)
{
"scripts": { "format": "oxfmt --check .", "format:fix": "oxfmt ." }
}注意点
- type-aware lint を有効にする場合、Compiled Package は事前にビルドが必要
- oxfmt はアルファ版のため本番採用には注意
- 統合ワークフロー: 検証は並列、修正は逐次実行(ファイル書き込み競合防止)
Playwright
環境変数の設定(Strict Mode 対応)
{
"tasks": {
"e2e": { "passThroughEnv": ["PLAYWRIGHT_*"] }
}
}またはグローバル:
{ "globalPassThroughEnv": ["PLAYWRIGHT_*"] }タスクグラフの設計
{ "tasks": { "e2e": { "dependsOn": ["^build"] } } }上流ビルドをスキップする場合:
turbo run e2e --filter=@repo/playwright-myapp --only共有ユーティリティパッケージ
Playwright を重複インストールしないよう peerDependencies を使用:
{
"name": "@repo/playwright-utilities",
"peerDependencies": { "playwright": "workspace:*" }
}Prisma
DB クライアントをモノレポ内の共有内部パッケージとして構成する。
クイックスタート
npx create-turbo@latest -e with-prisma主要な統合ポイント
- Prisma Client の初期化
- Internal Package パターンに従った構造化
- マイグレーション(
prisma migrate) - ローカル開発ワークフロー
- 本番デプロイ戦略
詳細は Prisma 公式ガイドを参照。
guides-tools
| Name | Description | Path |
|---|---|---|
| Biome | 高速フォーマッター兼リンター。ルートタスクとして運用が推奨。 | biome.md |
| Docker | モノレポでの Docker イメージ最適化。turbo prune で依存を分離。 | docker.md |
| ESLint | ESLint v9 Flat Config。設定パッケージ構成、lint タスク設定。 | eslint.md |
| Jest | テストフレームワーク。キャッシュ設定、ウォッチモードの分離。 | jest.md |
| Oxc (oxlint / oxfmt) | Rust 製の超高速 JavaScript / TypeScript ツールスイート。 | oxc.md |
| Playwright | E2E テスト。環境変数、タスクグラフ設計、共有ユーティリティ。 | playwright.md |
| Prisma | DB クライアントをモノレポ内の共有内部パッケージとして構成。 | prisma.md |
| shadcn/ui | モノレポ用 canary バージョン。コンポーネント追加とセットアップ。 | shadcn-ui.md |
| Storybook | デザインシステム向けコンポーネント駆動開発。キャッシュ、Co-Located…。 | storybook.md |
| Tailwind CSS | 共有設定パッケージ、UI パッケージ、スタイルビルドの最適化。 | tailwind.md |
| TypeScript | @repo/typescript-config による設定共有。exports フィールド、ベストプラク…。 | typescript.md |
| Vitest | テストフレームワーク。パッケージ単位、Projects、ハイブリッドアプローチ。 | vitest.md |
shadcn/ui
セットアップ
モノレポ用の canary バージョンを使用:
pnpm dlx shadcn@canary initセットアップウィザードで monorepo オプションを選択。
コンポーネントの追加
pnpm dlx shadcn@canary add [COMPONENT]注意点
- モノレポサポートは
@canaryバージョンが必須 - npm パッケージではなくファイルが直接コピーされる
- Tailwind CSS が前提条件
Storybook
テンプレートから開始
pnpm dlx create-turbo@latest -e design-systemキャッシュ設定
{ "tasks": { "build": { "outputs": ["storybook-static/**"] } } }.gitignore に storybook-static を追加。
Co-Located Stories パターン
大規模デザインシステムで推奨。ストーリーをソースパッケージ内に配置:
1. .storybook/main.ts でストーリーのパスをソースパッケージへ向ける 2. ストーリーファイルを本番ビルドの inputs から除外してキャッシュを維持
スタイルの統合
CSS は .storybook/preview.ts で手動インポートが必要。
Tailwind CSS
クイックスタート
pnpm dlx create-turbo@latest -e with-tailwindアーキテクチャ
共有 Tailwind 設定パッケージ
/* packages/tailwind-config/shared-styles.css */
@import "tailwindcss";
@theme {
--color-brand: #3b82f6;
}UI パッケージ
ui: プレフィックスを付けてスタイル優先度の競合を防ぐ:
<button class="ui:bg-blue-500 ui:text-white">Button</button>ベストプラクティス
スタイルビルドとコンポーネントビルドを別タスクに分離し、並列実行しつつ依存関係を正しく管理する。
TypeScript
設定共有 — @repo/typescript-config
packages/typescript-config/
base.json
nextjs.json
react-library.json// base.json の代表的なオプション
{ "compilerOptions": { "target": "es2022", "module": "NodeNext", "strict": true, "isolatedModules": true } }exports フィールド
{
"exports": {
"./*": { "types": "./src/*.ts", "default": "./dist/*.js" }
}
}型チェック
{ "scripts": { "check-types": "tsc --noEmit" } }ベストプラクティス
- bundler ではなく
tscを使う declaration: trueとdeclarationMap: trueを有効にする- TypeScript の
pathsより Node.js の subpath imports を使う(TS 5.4+) - ルートの
tsconfig.jsonは作成しない - TypeScript Project References は使わない(設定が複雑になりキャッシュ効率も悪化)
- ワークスペース全体で TypeScript のバージョンを統一する
Vitest
アプローチ 1: パッケージ単位(推奨)
{
"scripts": { "test": "vitest run", "test:watch": "vitest --watch" }
}{
"tasks": {
"test": { "dependsOn": ["^test"] },
"test:watch": { "cache": false, "persistent": true }
}
}カバレッジマージ: nyc merge → nyc report
アプローチ 2: Vitest Projects(ルート一元管理)
export default defineConfig({
projects: [
{ name: "web", root: "./apps/web", test: { include: ["src/**/*.test.ts"] } },
],
});{ "tasks": { "//#test": { "outputs": ["coverage/**"] } } }デメリット: どのパッケージを変更しても全体キャッシュミスが発生。
アプローチ 3: ハイブリッド
共有設定パッケージ @repo/vitest-config を作成し、各パッケージがインポート。
注意
workspacesは非推奨。projectsを使う- サンプル:
npx create-turbo@latest --example with-vitest
AI との連携
Agent Skills
npx skills add vercel/turborepoTurborepo のベストプラクティス・パターン・アンチパターンをエージェントに教える。
Git Worktrees による並列エージェント実行
turbo run build
git branch feature-branch && git worktree add ../agent-2-worktree feature-branch
cd ../agent-2-worktree && turbo run build # キャッシュが再利用されるTurborepo はワークツリー間でローカルキャッシュを自動共有する。
Task Descriptions
{
"tasks": {
"build": {
"description": "Compiles TypeScript and bundles the application",
"dependsOn": ["^build"],
"outputs": ["dist/**"]
},
"test": {
"description": "Runs the test suite with coverage",
"dependsOn": ["build"]
}
}
}AI がタスクの目的を理解しやすくなる。
ターミナルドキュメント検索
AI エージェントがシェルコマンドを実行できる場合、turbo docs でバージョン付きドキュメントを直接検索できる:
turbo docs [クエリ]機械可読ドキュメント
| 方法 | 説明 |
|---|---|
| Markdown ルート | URL 末尾に .md を付加(例: https://turborepo.dev/docs.md) |
| サイトマップ | https://turborepo.dev/sitemap.md |
| バージョン指定 | https://v2-7-6.turborepo.dev/docs のようにサブドメインで指定 |
コード生成
ビルトイン生成コマンド
turbo gen workspace # 空のパッケージを追加
turbo gen workspace --copy # 既存パッケージをテンプレートとして複製
turbo gen workspace --copy https://github.com/... # リモートから複製カスタムジェネレーター
内部的に Plop の設定形式を使用。設定ファイルの配置場所:
- モノレポルート:
turbo/generators/config.ts - 任意のワークスペース内:
{workspace}/turbo/generators/config.ts
import type { PlopTypes } from "@turbo/gen";
export default function generator(plop: PlopTypes.NodePlopAPI): void {
plop.setGenerator("Generator name", {
description: "Generator description",
prompts: [
{ type: "input", name: "name", message: "What is the name?" },
],
actions: [
{ type: "add", path: "src/{{name}}.ts", templateFile: "templates/component.hbs" },
],
});
}実行方法
turbo gen [generator-name]
turbo gen [generator-name] --args answer1 answer2注意点
- ESM 依存関係は現在非対応
- TypeScript 使用時は
@turbo/genを devDependency としてインストール
プラットフォーム対応
Node.js バージョン対応
package.json の engines キーで自動検出:
{ "engines": { "node": ">=18.0.0" } }OS・アーキテクチャ対応
Step 1: キャッシュキー生成スクリプト
const { writeFileSync } = require("fs");
const { platform, arch } = process;
writeFileSync("turbo-cache-key.json", JSON.stringify({ platform, arch }));Step 2: .gitignore に追加
turbo-cache-key.jsonStep 3: inputs に登録
{
"tasks": {
"build-for-platforms": {
"inputs": ["$TURBO_DEFAULT$", "turbo-cache-key.json"]
}
}
}または全タスクに適用:
{ "globalDependencies": ["turbo-cache-key.json"] }Step 4: Turborepo 実行前にスクリプトを実行
{
"scripts": {
"build-for-platforms": "node ./scripts/create-turbo-cache-key.js && turbo run build"
}
}ファイル生成は Turborepo 実行前に行う必要がある。
マイクロフロントエンド
Turborepo はローカル開発用のプロキシサーバーをビルトインで提供。複数アプリを単一エントリーポイント(デフォルト: http://localhost:3024)で統合できる。
microfrontends.json
{
"$schema": "https://turborepo.dev/microfrontends/schema.json",
"options": { "localProxyPort": 3024 },
"applications": {
"web": {
"development": { "local": { "port": 3000 } }
},
"docs": {
"packageName": "documentation",
"development": {
"local": { "port": 3001 },
"fallback": "example.com"
},
"routing": [
{ "group": "documentation", "paths": ["/docs", "/docs/:path*"] }
]
}
}
}ポート設定
{ "scripts": { "dev": "next dev --port $(turbo get-mfe-port)" } }Vite: TURBO_MFE_PORT 環境変数を使用。
フレームワーク別ベースパス設定
| フレームワーク | 設定ファイル | プロパティ |
|---|---|---|
| Next.js | next.config.ts | basePath |
| Nuxt / SvelteKit / Vite | vite.config.ts | base |
ルーティングパスパターン
| パターン | 説明 |
|---|---|
/pricing | 完全一致 |
/blog/:slug | パラメータ(単一セグメント) |
/docs/:path* | ワイルドカード(0以上) |
/api/:path+ | Plus(1以上) |
パスは大文字・小文字を区別する。
本番環境
Turborepo のプロキシはローカル開発専用。Vercel の場合は @vercel/microfrontends で本番対応。
Nx からの移行
移行の動機
- エコシステム標準への準拠(JS パッケージマネージャーのワークスペースをそのまま活用)
- 設定量の削減(約15行 vs 40行以上)
移行手順
1. .gitignore に .turbo を追加 2. ワークスペース定義を作成 3. 各アプリに package.json を追加 4. Nx プラグインを設定から削除 5. packageManager フィールドを指定 6. パッケージマネージャーの install を実行 7. Turborepo をインストール 8. turbo.json を作成 9. turbo build で動作確認 10. リモートキャッシュを有効化
設定対応表
| Nx | Turborepo |
|---|---|
sharedGlobals | globalDependencies |
cacheDirectory | cacheDir |
inputs | tasks[task].inputs |
outputs | tasks[task].outputs |
CLI 対応表
| Nx | Turborepo |
|---|---|
nx run | turbo run |
nx run-many | turbo run |
--projects | --filter |
--parallel | --concurrency |
段階的移行
タスク単位・パッケージ単位で1つずつ移行する。移行中は Nx と Turborepo を並行して使用可能。
多言語サポート
Turborepo はスクリプトの実行内容には関与しない設計のため、Rust や Go 等も統合可能。
ワークスペース定義への追加
# pnpm-workspace.yaml
packages:
- "apps/*"
- "packages/*"
- "cli"package.json によるラッピング
{
"name": "@repo/rust-cli",
"scripts": { "build": "cargo build --release" }
}キャッシング設定
{ "tasks": { "build": { "outputs": ["target/release/**"] } } }依存関係の定義
{ "dependencies": { "@repo/rust-cli": "workspace:*" } }非 JS ツールチェーン(Rust, Go 等)は別途インストール済みである必要がある。
ライブラリの公開
ビルド設定(tsup)
{ "scripts": { "build": "tsup src/index.ts --format cjs,esm --dts" } }キャッシュ設定
{ "tasks": { "build": { "outputs": ["dist/**"] } } }パッケージエントリーポイント
{
"main": "./dist/index.js",
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts"
}バージョン管理と公開(Changesets)
| コマンド | 説明 |
|---|---|
changeset | 新しい changeset を追加 |
changeset version | 新しいバージョンを作成 |
changeset publish | npm に公開 |
{
"scripts": {
"publish-packages": "turbo run build lint test && changeset version && changeset publish"
}
}スクリプト名を publish ではなく publish-packages にして npm ビルトインとの競合を防ぐ。
代替ツール
- intuit/auto — PR ラベルに基づいたリリース生成
- microsoft/beachball — セマンティックバージョン管理
Guides
| Name | Description | Path |
|---|---|---|
| AI との連携 | Agent Skills | ai.md |
| コード生成 | ビルトイン生成コマンド | generating-code.md |
| プラットフォーム対応 | Node.js バージョン対応 | handling-platforms.md |
| マイクロフロントエンド | Turborepo はローカル開発用のプロキシサーバーをビルトインで提供… | microfrontends.md |
| Nx からの移行 | エコシステム標準への準拠。設定量の削減(約15行 vs 40行以上)… | migrating-from-nx.md |
| 多言語サポート | Turborepo はスクリプトの実行内容には関与しない設計のため… | multi-language.md |
| ライブラリの公開 | ビルド設定(tsup) | publishing-libraries.md |
| 単一パッケージワークスペース | create-next-app や npm create vite で生成される単一アプリケーション構造… | single-package-workspaces.md |
| タスクのスキップ | キャッシュヒットを超えた最適化として、コード変更がないワークスペースの… | skipping-tasks.md |
単一パッケージワークスペース
create-next-app や npm create vite で生成される単一アプリケーション構造でも Turborepo を活用できる。
利用可能な機能
- ローカルキャッシング
- リモートキャッシング
- タスクの並列化
利用不可能な機能
- パッケージ間タスク(
app#buildのような指定)
シナリオ 1: タスクの順次実行
{
"tasks": {
"dev": { "dependsOn": ["db:seed"], "persistent": true },
"db:seed": { "dependsOn": ["db:push"] },
"db:push": {}
}
}実行順序: db:push → db:seed → dev
シナリオ 2: タスクの並列実行
turbo check-types lint formatシナリオ 3: キャッシュ入力の最適化
{
"tasks": {
"check-types": { "inputs": ["**/*.{ts,tsx}"] }
}
}タスクのスキップ
キャッシュヒットを超えた最適化として、コード変更がないワークスペースの CI タスクを完全にスキップする。
主要コマンド
turbo query affected --packages web
turbo query affected --tasks test --packages web
turbo query affected --packages web --base main --head HEAD--exit-code フラグ
| 戻り値 | 意味 |
|---|---|
0 | 影響なし(スキップ可能) |
1 | 影響あり(タスク実行が必要) |
2 | エラー |
turbo query affected --packages web --exit-codeシェルスクリプトでの使用例
#!/bin/bash
AFFECTED=$(turbo query affected --packages web)
COUNT=$(echo "$AFFECTED" | jq '.data.affectedPackages.length')
if [ "$COUNT" -eq 0 ]; then
echo "No affected packages, skipping tasks"
exit 0
fi
turbo run test --filter=webGit 履歴の注意点
シャロークローンでは全パッケージが変更済みとして扱われる場合がある。適切な履歴取得には以下を推奨:
git fetch --filter=blob:none --depth=0重要
turbo-ignore は非推奨。turbo query affected への移行を推奨。
CI with GitHub Actions
Run Turborepo tasks in GitHub Actions with Remote Cache and affected-package detection.
.github/workflows/ci.yml:
name: CI
on:
push:
branches: ["main"]
pull_request:
types: [opened, synchronize]
env:
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
TURBO_TEAM: ${{ vars.TURBO_TEAM }}
jobs:
build:
name: Build and Test
timeout-minutes: 15
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 2
- uses: pnpm/action-setup@v3
with:
version: 8
- uses: actions/setup-node@v4
with:
node-version: 20
cache: "pnpm"
- run: pnpm install
- run: pnpm turbo run lint check-types test
- run: pnpm turbo run build --affectedOptional local cache persistence between runs (alternative to Remote Cache):
- uses: actions/cache@v4
with:
path: .turbo
key: ${{ runner.os }}-turbo-${{ github.sha }}
restore-keys: |
${{ runner.os }}-turbo-Notes
fetch-depth: 2is required for--affectedto detect changes between commits; without Git history, source-diff filtering is unavailable- GitHub Actions automatically detects the PR base/head branches for
--affectedcomparisons TURBO_TOKENis a Vercel scoped access token;TURBO_TEAMis the Vercel team slug- Use
turbo run <task>explicitly (not bareturbo <task>) to avoid future subcommand name conflicts
Code Generation
Scaffold new packages or files using turbo gen with built-in or custom generators.
Built-in workspace generator:
# Add a new empty package
turbo gen workspace
# Copy an existing package as a template
turbo gen workspace --copy
# Copy from a remote repository
turbo gen workspace --copy https://github.com/org/repoCustom generator — turbo/generators/config.ts at the monorepo root:
import type { PlopTypes } from "@turbo/gen";
export default function generator(plop: PlopTypes.NodePlopAPI): void {
plop.setGenerator("react-component", {
description: "Add a new React component",
prompts: [
{ type: "input", name: "name", message: "Component name?" },
],
actions: [
{
type: "add",
path: "src/components/{{pascalCase name}}.tsx",
templateFile: "templates/component.hbs",
},
],
});
}Run a custom generator:
turbo gen react-component
# Pass answers directly (non-interactive)
turbo gen react-component --args MyButtonNotes
- Generators use Plop configuration format internally
- Place generator configs either at the monorepo root (
turbo/generators/config.ts) or inside any workspace ({workspace}/turbo/generators/config.ts) - Install
@turbo/genas a devDependency when using TypeScript configs - ESM-only dependencies are not currently supported inside generator configs
Development Workflow
Run persistent development servers across all packages with watch mode support.
turbo.json:
{
"tasks": {
"dev": {
"cache": false,
"persistent": true
}
}
}With a setup script that runs before dev servers start:
{
"tasks": {
"dev": {
"cache": false,
"persistent": true,
"dependsOn": ["//#dev:setup"]
},
"//#dev:setup": {
"outputs": [".codegen/**"]
}
}
}Common commands:
# Start all dev tasks across the monorepo
turbo dev
# Start dev only for the web app and its dependencies
turbo dev --filter=web
# Watch mode — reruns dependent tasks when a package changes
turbo watch dev lintRun two persistent tasks in parallel using with:
{
"tasks": {
"dev": {
"with": ["api#dev"],
"persistent": true,
"cache": false
}
}
}Notes
"cache": falseis required for dev tasks — source changes are continuous and caching would cause stale output"persistent": trueprevents other tasks from incorrectly depending on a long-running processturbo watchreruns tasks in dependent packages automatically when upstream packages change- Teardown scripts (e.g. database cleanup) must be triggered manually:
turbo run dev:teardown
Environment Variables
Declare environment variables so Turborepo includes them in cache hash computation.
{
"$schema": "https://turborepo.com/schema.json",
"globalEnv": ["NODE_ENV"],
"globalPassThroughEnv": ["AWS_ACCESS_KEY_ID"],
"tasks": {
"build": {
"env": ["MY_API_URL", "MY_API_KEY"],
"passThroughEnv": ["CI"]
}
}
}Include .env files in the hash so cache invalidates when secrets change:
{
"globalDependencies": [".env"],
"tasks": {
"build": {
"inputs": ["$TURBO_DEFAULT$", ".env*"]
}
}
}Debug which variables are (or are not) affecting the cache:
turbo build --summarizeNotes
envandglobalEnv: variable value is hashed — a change triggers a cache misspassThroughEnvandglobalPassThroughEnv: variable is available at runtime but does not affect the hash- In
strictmode (default), undeclared variables are not passed to tasks at all; useloosemode only when migrating - Framework-specific prefixes (
NEXT_PUBLIC_*,VITE_*, etc.) are inferred automatically and included in the hash - Place
.envfiles inside the app package, not the repo root, for tighter scoping
Filtering Tasks
Run tasks only for specific packages using --filter.
# By package name
turbo run build --filter=@acme/web
# By directory glob
turbo run lint --filter="./packages/*"
# Include all packages that depend on ui (upstream)
turbo run build --filter=...ui
# Include ui and all packages it depends on (downstream)
turbo run dev --filter=web...
# Only packages changed since last commit
turbo run build --affected
# Only packages changed relative to a branch
turbo run build --filter=[origin/main]
# Combine multiple filters (union)
turbo run test --filter=@acme/web --filter=@acme/api
# Exclude a package
turbo run lint --filter=!@acme/docs
# Shorthand: run specific package#task pairs (v2.2.4+)
turbo run web#build docs#lintRoot package.json scripts for common workflows:
{
"scripts": {
"build": "turbo run build",
"dev": "turbo run dev",
"test": "turbo run test",
"lint": "turbo run lint"
}
}Notes
- Multiple
--filterflags are combined as OR (union) ...pkgmeans "pkg and all packages that depend on it";pkg...means "pkg and all packages it depends on"^in filter syntax (e.g.^...ui) excludes the matched package itself and includes only its relatives- Do not write
turbocommands inside individual packagepackage.jsonscripts — only in the root
Internal Packages
Create a shared TypeScript package consumed by apps inside the monorepo.
Directory layout:
packages/math/
src/
add.ts
subtract.ts
package.json
tsconfig.jsonpackages/math/package.json:
{
"name": "@repo/math",
"type": "module",
"exports": {
"./add": { "types": "./dist/add.d.ts", "default": "./dist/add.js" },
"./subtract": { "types": "./dist/subtract.d.ts", "default": "./dist/subtract.js" }
},
"scripts": {
"dev": "tsc --watch",
"build": "tsc"
},
"devDependencies": {
"typescript": "latest",
"@repo/typescript-config": "workspace:*"
}
}packages/math/tsconfig.json:
{
"extends": "@repo/typescript-config/base.json",
"compilerOptions": { "outDir": "dist", "rootDir": "src" },
"include": ["src"],
"exclude": ["node_modules", "dist"]
}Declare the dependency in any consuming app (pnpm / bun):
{ "dependencies": { "@repo/math": "workspace:*" } }For npm / yarn:
{ "dependencies": { "@repo/math": "*" } }Cache build output in root turbo.json:
{
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**"]
}
}
}Notes
includeandexcludeintsconfig.jsonare not inherited from the base config — always declare them explicitly- Use
exportsinstead of a barrelindex.tsto enable tree-shaking and IDE auto-completion per entry point workspace:*(pnpm/bun) or"*"(npm/yarn) tells the package manager to resolve the package from the local workspace
Monorepo Setup
Bootstrap a new Turborepo monorepo with apps and shared packages.
# Create with pnpm
pnpm dlx create-turbo@latest
# Create with npm
npx create-turbo@latest
# Create with yarn
yarn dlx create-turbo@latestResulting structure:
apps/
web/ # Next.js app
docs/ # docs app
packages/
ui/ # shared UI components
eslint-config/
typescript-config/
turbo.json
package.jsonpnpm-workspace.yaml (or root package.json workspaces field for npm/yarn):
packages:
- "apps/*"
- "packages/*"Root turbo.json:
{
"$schema": "https://turborepo.com/schema.json",
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**", ".next/**", "!.next/cache/**"]
},
"lint": {},
"test": {
"dependsOn": ["build"]
},
"dev": {
"cache": false,
"persistent": true
}
}
}Notes
apps/holds deployable applications;packages/holds shared libraries and configs- Nested packages (e.g.
apps/**) are not supported — use a flat list in workspace definitions - Add
turboto devDependencies at the root to pin the version across the team - Use scoped package names (e.g.
@acme/ui) to avoid collisions
Publishing Packages
Build and publish versioned packages from a Turborepo monorepo using Changesets.
packages/ui/package.json — build script and entry points:
{
"name": "@acme/ui",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"scripts": {
"build": "tsup src/index.ts --format cjs,esm --dts"
}
}Root turbo.json — cache built output:
{
"tasks": {
"build": {
"outputs": ["dist/**"]
}
}
}Root package.json — publish workflow script:
{
"scripts": {
"publish-packages": "turbo run build lint test && changeset version && changeset publish"
}
}Changeset commands:
# Create a changeset describing what changed
changeset
# Bump versions based on collected changesets
changeset version
# Build and publish to npm
changeset publishNotes
- Name the script
publish-packagesrather thanpublishto avoid conflict with the npm built-inpublishlifecycle hook - Run
turbo run build lint testbeforechangeset publishto ensure only verified artifacts are released - Alternative version management tools:
intuit/auto(PR-label-based) andmicrosoft/beachball
samples
| Name | Description | Path |
|---|---|---|
| CI with GitHub Actions | Run Turborepo tasks in GitHub Actions with Remote Cache and affected-package detec… | ci-github-actions.md |
| Code Generation | Scaffold new packages or files using turbo gen with built-in or custom generato… | code-generation.md |
| Development Workflow | Run persistent development servers across all packages with watch mode support. | dev-workflow.md |
| Environment Variables | Declare environment variables so Turborepo includes them in cache hash computation… | environment-variables.md |
| Filtering Tasks | Run tasks only for specific packages using --filter. | filtering-tasks.md |
| Internal Packages | Create a shared TypeScript package consumed by apps inside the monorepo. | internal-packages.md |
| Monorepo Setup | Bootstrap a new Turborepo monorepo with apps and shared packages. | monorepo-setup.md |
| Publishing Packages | Build and publish versioned packages from a Turborepo monorepo using Changesets. | publishing-packages.md |
| Remote Caching | Share build cache artifacts across team members and CI using Vercel Remote Cache… | remote-caching.md |
| Task Pipeline | Define task execution order and dependency relationships in turbo.json. | task-pipeline.md |
Remote Caching
Share build cache artifacts across team members and CI using Vercel Remote Cache.
# Step 1: authenticate
turbo login
# Step 2: link the repository to your Vercel account
turbo link
# Step 3: verify (clear local cache then rebuild — should hit remote)
rm -rf ./.turbo/cache
turbo run buildFor CI (GitHub Actions example):
env:
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
TURBO_TEAM: ${{ vars.TURBO_TEAM }}Enable HMAC-SHA256 artifact signature verification in turbo.json:
{
"remoteCache": {
"signature": true
}
}Set the signing key via environment variable:
TURBO_REMOTE_CACHE_SIGNATURE_KEY=<secret>Notes
- Vercel Remote Cache is free on all plans; the repository does not need to be hosted on Vercel
TURBO_TOKENis a scoped access token created in Vercel project settingsTURBO_TEAMis the Vercel team slug (visible in the Vercel dashboard URL)- Self-hosting is supported via any HTTP server that implements the Turborepo Remote Cache API
Task Pipeline
Define task execution order and dependency relationships in turbo.json.
{
"$schema": "https://turborepo.com/schema.json",
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**"]
},
"test": {
"dependsOn": ["build"]
},
"lint": {},
"deploy": {
"dependsOn": ["^build"],
"cache": false
}
}
}Key dependsOn patterns:
| Pattern | Meaning |
|---|---|
["^build"] | Run all dependency packages' build first (topological) |
["build"] | Run build in the same package first |
["utils#build"] | Run build only in the utils package first |
[] or omitted | No dependencies — runs in parallel with other tasks |
Notes
"^build"is the most common pattern: ensures all upstream dependencies are built before the current package- Tasks without
dependsOnrun in parallel automatically "cache": falseis required for side-effectful tasks such asdeployorpublishoutputsmust be declared for file artifacts to be cached and restored
Build & Deploy
ビルド・デプロイ・Docker 向け操作コマンド。
ビルドタスクの実行
turbo run build特定パッケージのビルド
turbo run build --filter=web
turbo run build --filter=@acme/web
turbo run build --filter=./apps/web複数タスクの並列実行
turbo run build test lint check-types変更パッケージのみビルド
turbo run build --affected
turbo run build --filter=[HEAD^1]
turbo run build --filter=[origin/main]Docker 向け部分モノレポの生成(turbo prune)
警告: --out-dir に既存ディレクトリを指定すると内容が上書きされる。turbo prune <package>| オプション | デフォルト | 説明 |
|---|---|---|
--docker | false | Docker レイヤーキャッシュ最適化向け出力構造を生成 |
--out-dir <path> | ./out | 出力ディレクトリのパス |
--use-gitignore | true | .gitignore を考慮 |
Docker 向けに出力する例:
turbo prune web --docker--docker フラグを使った場合の出力構造:
out/
├── json/ # package.json のみ(依存インストール用)
├── full/ # 完全なソースコード(ビルド用)
└── pnpm-lock.yaml # プルーニング済みロックファイルカスタム出力先を指定:
turbo prune web --docker --out-dir=./docker-outタスクグラフの可視化
turbo run build --graph
turbo run build --graph=graph.svg
turbo run build --graph=graph.html
turbo run build --graph=graph.mermaidビルド結果の確認
turbo run build --dry
turbo run build --dry=json
turbo run build --summarize同時実行数の制御
turbo run build --concurrency=10
turbo run build --concurrency=50% # CPU 数の 50% を使用エラー時の続行設定
turbo run build --continue=always # 常に続行
turbo run build --continue=dependencies-successful # 依存が成功したら続行
turbo run build --continue=never # エラーで即停止(デフォルト)Cache
キャッシュ制御・Remote Caching のセットアップと管理コマンド。
Remote Cache 認証・接続
# Vercel に認証(デフォルト)
turbo login
# SSO チームで認証
turbo login --sso-team=slug-for-team
# 手動でトークンを入力
turbo login --manual
# カスタム API エンドポイントで認証
turbo login --api=https://acme.com/api
# ログアウト
turbo logoutリモートキャッシュへのリンク
# リポジトリを Remote Cache にリンク
turbo link
# チームスコープを指定してリンク
turbo link --scope=my-team
# 確認プロンプトをスキップ
turbo link --yes
# カスタム Remote Cache プロバイダーにリンク
turbo link --api=https://acme.com/api
# リンクを解除
turbo unlinkRemote Cache の動作確認
rm -rf ./.turbo/cache
turbo run build再実行時に FULL TURBO が表示されれば Remote Cache が機能している。
キャッシュ制御フラグ(turbo run と組み合わせて使用)
# キャッシュを無視して強制再実行
turbo run build --force
# ローカルキャッシュ読み書き・リモートキャッシュ読み込みのみ
turbo run build --cache=local:rw,remote:r
# キャッシュディレクトリを変更
turbo run build --cache-dir="./my-cache"
# タスク計画のみ確認(実行なし)
turbo run build --dry
# 実行メタデータ(ハッシュ・入出力)を JSON で出力
turbo run build --summarize--cache の書式: local:<r|w|rw>,remote:<r|w|rw>(例: local:r,remote:rw)
パフォーマンスデバッグ
# タスク計画の確認(JSON 形式)
turbo run build --dry=json
# パフォーマンストレースの生成
turbo run build --profile=my-profile.jsonCLI
turbo CLI の主要コマンドリファレンス。
タスク実行(turbo run)
turbo run <task> [options]
turbo <task> # run は省略可能複数タスクを同時実行する場合:
turbo run build test lint check-typesturbo run のフィルタリング
# パッケージ名でフィルター
turbo run build --filter=web
turbo run build --filter=@acme/ui
# ディレクトリでフィルター
turbo run lint --filter="./packages/utilities/*"
# 依存元(上流)を含む
turbo run build --filter=...@acme/ui
# 依存先(下流)を含む
turbo run dev --filter=web...
# 変更のあったパッケージのみ
turbo run build --affected
# Git 差分ベース
turbo run build --filter=[HEAD^1]
turbo run build --filter=[origin/main]
# 特定タスクのショートハンド(v2.2.4+)
turbo run web#build docs#lint
# 除外
turbo run build --filter=./apps/* --filter=!./apps/adminturbo run の主要オプション
| オプション | 説明 |
|---|---|
--filter <pattern> / -F | 実行対象パッケージを絞り込む |
--affected | 変更があったパッケージのみ実行 |
--only | 依存タスクを実行せず指定タスクのみ |
--force | キャッシュを無視して再実行 |
--cache | キャッシュの読み書きモード設定 |
--cache-dir <path> | キャッシュディレクトリを指定 |
--concurrency <n> | 最大同時実行数(デフォルト: 10) |
--continue <mode> | エラー時の動作(never/dependencies-successful/always) |
--env-mode | 環境変数のアクセス制御(strict/loose) |
--dry / --dry-run | 実行せずにタスク計画を表示 |
--dry=json | タスク計画を JSON 形式で出力 |
--graph | タスクグラフを可視化(svg/html/mermaid/dot) |
--output-logs | ログ出力レベル設定 |
--summarize | 実行メタデータを JSON で出力 |
--profile <file> | パフォーマンストレースを生成 |
--json | NDJSON 形式で出力 |
--log-file <file> | 構造化ログをファイルに書き込む |
--team <slug> | リモートキャッシュのチームスラグ |
--token <token> | リモートキャッシュの Bearer トークン |
--verbosity | ログレベル指定(-v, -vv, -vvv) |
よく使う turbo run の組み合わせ
turbo run build --affected # 変更パッケージのみビルド
turbo run build --dry=json # ドライラン(JSON 出力)
turbo run test --continue=always # エラーでも続行
turbo run build --cache=local:r,remote:rw # ローカル読み込みのみ
turbo run build --force # キャッシュを無視して再実行
turbo run build --graph=graph.svg # タスクグラフを SVG で出力
turbo run build --summarize # 実行サマリーを生成
turbo run build --concurrency=50% # CPU 数の 50% を使用ウォッチモード(turbo watch)
turbo watch [tasks]
turbo watch dev lintコードの変更をもとにタスクを再実行する。"persistent": true のタスクは無視される。
実験的なキャッシュ書き込み:
turbo watch your-tasks --experimental-write-cacheパッケージ一覧(turbo ls)
turbo ls # 全パッケージ一覧
turbo ls web @repo/ui # 特定パッケージの詳細
turbo ls --affected # 変更パッケージのみ
turbo ls --affected --filter=web # affected と filter の積集合
turbo ls --output=json # JSON 形式で出力依存関係違反チェック(turbo boundaries)
turbo boundariesパッケージディレクトリ外のインポートおよび package.json に未宣言のパッケージのインポートを検出する(実験的機能)。
GraphQL クエリ(turbo query)
turbo query # GraphiQL インタラクティブモード
turbo query "query { packages { items { name } } }" # 直接実行
turbo query query.gql # ファイルから実行
turbo query --schema # GraphQL スキーマを出力変更影響分析:
turbo query affected
turbo query affected --tasks build test
turbo query affected --base=main --head=HEADデバッグ情報(turbo info)
turbo infoバージョン、パス、デーモン状態、パッケージマネージャー、プラットフォーム情報を表示する。
パッケージグラフの可視化(turbo devtools)
turbo devtools
turbo devtools --port=9876
turbo devtools --no-openブラウザでパッケージグラフを可視化する。
テレメトリー管理
turbo telemetry status # テレメトリーの現在の状態を確認
turbo telemetry enable # テレメトリーを有効化
turbo telemetry disable # テレメトリーを無効化グローバルフラグ
| フラグ | 説明 |
|---|---|
--color | カラー出力を強制 |
--no-color | カラー出力を無効化 |
--no-update-notifier | バージョン更新通知を無効化 |
--cwd <path> | 作業ディレクトリを指定 |
Dev
開発サーバー起動・ウォッチモードコマンド。
全パッケージの開発サーバー起動
turbo run dev
turbo devturbo.json で "persistent": true を設定した dev タスクが対象。
特定パッケージのみ起動
turbo run dev --filter=web
turbo dev --filter=web依存パッケージを含めて起動
turbo dev --filter=web...ウォッチモードで開発
turbo watch dev
turbo watch dev lintファイル変更を検知してタスクを自動再実行する。依存関係グラフを考慮し、変更されたパッケージの下流タスクも再実行する。
"persistent": true のタスクは turbo watch に無視される。"interruptible": true のタスクは変更検知時に再起動される。
実験的なキャッシュ書き込み付きウォッチ
turbo watch dev --experimental-write-cacheティアダウンスクリプトの手動実行
turbo run dev:teardownTurborepo はティアダウンスクリプトを自動実行しないため、手動で呼び出す。
ターミナル UI キーバインド
| キー | 機能 |
|---|---|
m | キーバインドメニューの表示切替 |
↑ / ↓ または j / k | タスクリストのナビゲーション |
p | 選択タスクのピン留め切替 |
h | タスクリストの表示切替 |
c | ハイライトされたログをコピー |
u / d | ログのスクロール上下 |
i | タスクとのインタラクション開始 |
Ctrl+z | インタラクションの停止 |
Generate
turbo gen / turbo generate によるコード生成コマンド。
新規ワークスペースの追加
turbo gen workspace
turbo generate workspaceインタラクティブプロンプトで名前・種別・配置先を設定する。
ワークスペース作成のオプション
turbo gen workspace [options]| オプション | 説明 |
|---|---|
--name <name> | ワークスペースの名前(package.json の name フィールド) |
--empty | 空のワークスペースを作成(デフォルト: true) |
--copy <name/url> | 既存ワークスペースまたは GitHub URL からコピー |
--destination <path> | 作成先のパス |
| `--type <app\ | package>` |
--root <path> | リポジトリルートのパス |
--show-all-dependencies | ワークスペース種別によるフィルタリングを無効化 |
--example-path <path>, -p | GitHub URL でブランチ名とパスを分離する |
既存ワークスペースからのコピー
turbo gen workspace --copyリモートリポジトリからのコピー
turbo gen workspace --copy https://github.com/<owner>/<repo>カスタムジェネレーターの実行
turbo gen run [generator-name]
turbo gen [generator-name]turbo/generators/config.js(または config.ts)に定義したジェネレーターを実行する。
カスタムジェネレーターのオプション
turbo gen run [generator-name] [options]| オプション | 説明 |
|---|---|
--args <answers...> | ジェネレーターのプロンプトに直接渡す回答 |
--config <path> | ジェネレーター設定ファイルのパス(デフォルト: turbo/generators/config.js) |
--root <path> | リポジトリルートのパス |
プロンプトへの回答を直接渡す例
turbo gen run my-generator --args answer1 answer2Inspect
モノレポ構造・依存関係・境界違反の検査コマンド。
パッケージ一覧の確認
turbo ls
turbo ls --output=json特定パッケージの詳細確認
turbo ls web @repo/uiパッケージ名、ディレクトリ、内部依存関係、タスク一覧を表示する。
変更パッケージの確認
turbo ls --affected
TURBO_SCM_BASE=development turbo ls --affected変更パッケージのフィルター付き確認
turbo ls --affected --filter=webGraphQL によるクエリ分析
# GraphiQL インタラクティブモード
turbo query
# インラインクエリの実行
turbo query "query { packages { items { name } } }"
# ファイルからクエリを実行
turbo query query.gql
# GraphQL スキーマの出力
turbo query --schema
# クエリ変数の指定
turbo query query.gql --variables=vars.json変更影響の分析(turbo query affected)
turbo query affected
turbo query affected --tasks build test
turbo query affected --packages @acme/ui
turbo query affected --base=main --head=HEAD
turbo query affected --exit-code--exit-code フラグ: 変更あり=1、なし=0、エラー=2
依存関係違反の検査(turbo boundaries)
turbo boundaries以下の違反を検出する(実験的機能):
- パッケージディレクトリ外のファイルインポート
package.jsonのdependenciesに未宣言のパッケージのインポート
タスクグラフの出力
turbo run build --graph
turbo run build --graph=graph.svg
turbo run build --graph=graph.html
turbo run build --graph=graph.mermaid
turbo run build --graph=graph.dotパッケージグラフの可視化(ブラウザ)
turbo devtools
turbo devtools --port=9876
turbo devtools --no-openデバッグ情報の表示
turbo infoバージョン、パス、デーモン状態、パッケージマネージャー、プラットフォーム情報を表示する。
Install
Turborepo のインストールと新規プロジェクト作成コマンド。
新規プロジェクト作成(create-turbo)
# npm
npx create-turbo@latest
# pnpm
pnpm dlx create-turbo@latest
# yarn
yarn dlx create-turbo@latest
# bun
bunx create-turbo@latestスターターには2つのアプリケーションと3つの共有パッケージが含まれる。
create-turbo のオプション
npx create-turbo@latest [options]| フラグ | 説明 |
|---|---|
-m, --package-manager | パッケージマネージャーを指定 |
-e, --example | テンプレート名または GitHub URL |
--skip-install | 依存関係のインストールをスキップ |
--turbo-version | インストールする turbo バージョンを指定 |
グローバルインストール
# npm
npm install turbo --global
# pnpm
pnpm add turbo --global
# yarn
yarn global add turbo
# bun
bun install turbo --globalグローバルの turbo はリポジトリにローカルバージョンが存在する場合、自動的にそちらに委譲する。
devDependency としてのインストール
# npm
npm install turbo --save-dev
# pnpm
pnpm add turbo --save-dev --ignore-workspace-root-check
# yarn
yarn add turbo --dev --ignore-workspace-root-check
# bun
bun install turbo --devチーム全体でバージョンを統一するため、ワークスペースルートの devDependency に追加する。
既存リポジトリへの追加(pnpm の例)
pnpm add turbo --global
pnpm add turbo --save-dev --ignore-workspace-root-checkStep 2 以降は turbo.json 作成、.gitignore への .turbo 追加、packageManager フィールドの設定が必要。
@turbo/gen のインストール(カスタムジェネレーター使用時)
# npm
npm install @turbo/gen --save-dev
# pnpm
pnpm add @turbo/gen --save-dev
# yarn
yarn add @turbo/gen --devTypeScript でカスタムジェネレーターを作成する場合に必要。
Migrate
バージョンアップグレード・移行コマンド。
@turbo/codemod による自動移行
npx @turbo/codemod migrate非推奨機能・破壊的変更の自動移行を実行する。
ドライランで変更内容を確認してから実行
npx @turbo/codemod migrate --dry警告:migrateは設定ファイルやpackage.jsonを書き換える。--dryで事前に変更内容を確認することを推奨。
turbo scan による最適化設定(非推奨)
turbo scanGit FS Monitor・Remote Caching・バージョンチェック等をインタラクティブに設定する。
注記: turbo scan は非推奨(deprecated)であり、将来のバージョンで削除される予定。Scripts
| Name | Description | Path |
|---|---|---|
| Build & Deploy | ビルド・デプロイ・Docker 向け操作コマンド。 | build-deploy.md |
| Cache | キャッシュ制御・Remote Caching のセットアップと管理コマンド。 | cache.md |
| CLI | turbo CLI の主要コマンドリファレンス。 | cli.md |
| Dev | 開発サーバー起動・ウォッチモードコマンド。 | dev.md |
| Generate | turbo gen / turbo generate によるコード生成コマンド。 | generate.md |
| Inspect | モノレポ構造・依存関係・境界違反の検査コマンド。 | inspect.md |
| Install | Turborepo のインストールと新規プロジェクト作成コマンド。 | install.md |
| Migrate | バージョンアップグレード・移行コマンド。 | migrate.md |