lerna と turbo は、複数のパッケージを単一のリポジトリで管理する「モノレポ」開発を支援するツールです。lerna は長年モノレポ管理の標準として親しまれてきたツールで、バージョン管理やパッケージの公開(publish)に強い特徴があります。一方、turbo(Turbo Repo)は、タスクの実行キャッシュと並列処理に特化し、ビルドやテストの高速化を主目的としたモダンなツールです。どちらも npm や yarn、pnpm といったパッケージマネージャーと連携して動作しますが、解決しようとする課題とアプローチが異なります。
大規模なフロントエンドプロジェクトにおいて、複数のパッケージを一つのリポジトリで管理する「モノレポ」構成は一般的になりました。しかし、リポジトリが大きくなるほど、ビルド時間の増大や依存関係の複雑さが開発者の悩みの種となります。ここで登場するのが lerna と turbo です。
両者はともにモノレポを支える重要なツールですが、その「役割」と「得意分野」は明確に異なります。lerna はモノレポの「バージョン管理と公開」に焦点を当てたベテランであり、turbo は「タスク実行の高速化」に特化した新星です。この違いを理解せず選定すると、プロジェクトの成長とともに運用コストが膨らむ可能性があります。
まず押さえるべきは、両者が解決しようとしている本質的な課題の違いです。
lerna は、主に「複数のパッケージのバージョンをどう管理し、どう公開するか」を解決します。
// lerna.json の設定例
{
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
"version": "1.0.0",
"packages": ["packages/*"]
}
turbo は、主に「タスク(ビルド、テストなど)をいかに速く実行するか」を解決します。
// turbo.json の設定例
{
"$schema": "https://turbo.build/schema.json",
"pipeline": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**"]
},
"test": {
"dependsOn": ["build"]
}
}
}
現代のモノレポ開発で最も重要なのが、いかに無駄なビルドを省き、フィードバックループを短くするかです。この点において、両者のアプローチは対照的です。
lerna は、タスクを複数のパッケージで並列に実行する機能(lerna run)を提供しますが、基本的には「その場での実行」が中心です。
turbo や nx に譲る傾向にあります。# lerna: 全パッケージで build スクリプトを並列実行
# キャッシュ機能は標準では提供されないため、毎回実行されます
npx lerna run build --parallel
turbo は、強力なリモートキャッシュとローカルキャッシュを備えています。
# turbo: ビルドタスクを実行(キャッシュがあれば即座に完了)
# 依存するパッケージのビルドが完了するまで待機し、結果を再利用します
npx turbo run build
# ローカルキャッシュのヒット率を確認
# タスク実行後に Summary が表示されます
モノレポの利点である「パッケージ間の即時反映」をどう実現するかについても、両者は異なる方法を提供します。
lerna は、lerna bootstrap(または lerna link)コマンドにより、パッケージ間のシンボリックリンクを作成します。
# lerna: 依存関係をリンクして開発環境を準備
# 従来のワークスペース設定と組み合わせて使用されます
npx lerna bootstrap
# 現在では pnpm や npm の workspace 機能を使い、lerna はリンク処理のみを行うことも多いです
turbo は、依存関係の解決そのものよりも、依存関係を「理解してタスクを順序付ける」ことに長けています。
turbo 自体がリンクを作成するわけではなく、すでに解決された依存関係グラフをもとに、ビルド順序を最適化します。# turbo: パッケージマネージャーがリンクを解決した状態で、タスクを実行
# turbo.json で "^build" と指定することで、依存パッケージのビルドを先に実行させます
{
"pipeline": {
"build": {
"dependsOn": ["^build"]
}
}
}
ここが両者の最大の分岐点です。パッケージを外部に公開する必要があるかどうかで、選択が大きく変わります。
lerna は、バージョン管理と公開のための包括的なコマンドを提供します。
lerna version:変更されたパッケージを検出し、バージョン番号を更新し、Git タグを作成します。lerna publish:更新されたパッケージを npm registry に公開します。# lerna: バージョンアップと公開を一度に実行
# 変更されたパッケージを自動的に検出し、ユーザーにバージョン選択を促します
npx lerna version
npx lerna publish from-git
# 独立モードの場合、各パッケージが独自のバージョンを持ちます
# lerna.json で "version": "independent" と設定
turbo は、バージョン管理や公開機能を提供しません。
# turbo: 公開機能はないため、標準の npm publish または Changesets を使用
# タスクとして登録することは可能ですが、バージョン管理ロジックは含まれません
npm publish
# または
npx changeset publish
実際のプロジェクトでは、どちらか一方だけを「絶対的な正解」として選ぶのではなく、課題に合わせて使い分ける、あるいは組み合わせることが重要です。
複数の UI コンポーネントライブラリやユーティリティパッケージを開発し、定期的に npm へ公開しているチーム。
lerna (または lerna + turbo)turbo を併用してビルドのみ高速化するというハイブリッド構成も有効です。一つの巨大なアプリケーションを複数のチームで開発しており、ビルド時間の短縮が最優先課題。
turboturbo のキャッシュ機能が開発者の待ち時間を劇的に減らします。新規プロジェクトで、最新のベストプラクティスを採用したい。
turbo + pnpm workspaces + changesets| 機能 | lerna | turbo |
|---|---|---|
| 主目的 | バージョン管理と公開 | タスクの高速化とキャッシュ |
| ビルドキャッシュ | 標準では非対応(要設定) | 強力なローカル/リモートキャッシュ |
| タスク並列実行 | 対応 (--parallel) | 対応(依存関係に基づく最適化) |
| バージョン管理 | 内蔵 (lerna version) | 非対応(他ツールと併用) |
| パッケージ公開 | 内蔵 (lerna publish) | 非対応 |
| 依存関係リンク | 内蔵 (bootstrap) | パッケージマネージャーに委譲 |
| 設定ファイル | lerna.json | turbo.json |
かつて lerna はモノレポの「すべて」を管理するスイスアーミーナイフのような存在でした。しかし、エコシステムが成熟するにつれ、役割は専門化されています。
もしあなたが「ビルドを速くしたい」のであれば、迷わず turbo を選んでください。その圧倒的なキャッシュ機能は、開発体験を一新します。
一方で、「複数のパッケージのバージョンを揃えて公開したい」という要件が強い場合は、依然として lerna が有力な選択肢です。ただし、将来的には changesets などのモダンなツールへの移行も視野に入れると、より柔軟なアーキテクチャを構築できるでしょう。
重要なのは、ツールに「すべて」を任せようとせず、それぞれの強みを組み合わせて、あなたのチームに最適なワークフローを構築することです。
ビルド、テスト、lint などのタスク実行速度を最大化したい場合、そしてパイプラインのキャッシュ機能を活用して CI/CD コストを削減したい場合に turbo を選定すべきです。複数のパッケージが含まれる大規模なモノレポで、変更があった部分だけを効率的に処理したいチームに最適です。パッケージの公開機能自体には焦点を当てていないため、公開フローには別途標準的なツールやスクリプトを使用する前提となります。
複数の独立したパッケージを npm registry に公開する必要があり、バージョン番号を同期させて管理したい場合に lerna を選定すべきです。特に、従来の「バージョンアップ→タグ付け→公開」というワークフローを維持しつつ、パッケージ間の依存関係解決だけを支援させたいプロジェクトに適しています。ただし、ビルドの高速化やタスクの並列実行が主目的の場合は、他のツールとの併用が必要になる点に注意してください。
Turborepo is the build system for coding agents.
Visit https://turborepo.dev to get started with Turborepo.
See CONTRIBUTING.md for more information.
The Turborepo community can be found on GitHub Discussions, where you can ask questions, voice ideas, and share your projects.
To chat with other community members, you can join Vercel Community's #turborepo tag.
Our Code of Conduct applies to all Turborepo community channels.
Turborepo is used by the world's leading companies. Check out the Turborepo Showcase to learn more.
Follow @turborepo on X for project updates.
If you believe you have found a security vulnerability in Turborepo, we encourage you to responsibly disclose this and not open a public issue. We will investigate all legitimate reports. Email security@vercel.com to disclose any security vulnerabilities.