turbo vs lerna
モノレポ管理ツールの選定:Lerna と Turbo の比較
turbolerna類似パッケージ:

モノレポ管理ツールの選定:Lerna と Turbo の比較

lernaturbo は、複数のパッケージを単一のリポジトリで管理する「モノレポ」開発を支援するツールです。lerna は長年モノレポ管理の標準として親しまれてきたツールで、バージョン管理やパッケージの公開(publish)に強い特徴があります。一方、turbo(Turbo Repo)は、タスクの実行キャッシュと並列処理に特化し、ビルドやテストの高速化を主目的としたモダンなツールです。どちらも npm や yarn、pnpm といったパッケージマネージャーと連携して動作しますが、解決しようとする課題とアプローチが異なります。

npmのダウンロードトレンド

3 年

GitHub Starsランキング

統計詳細

パッケージ
ダウンロード数
Stars
サイズ
Issues
公開日時
ライセンス
turbo23,499,41631,04157.9 kB157日前MIT
lerna1,932,63436,054608 kB29113日前MIT

モノレポ管理の核心:Lerna vs Turbo

大規模なフロントエンドプロジェクトにおいて、複数のパッケージを一つのリポジトリで管理する「モノレポ」構成は一般的になりました。しかし、リポジトリが大きくなるほど、ビルド時間の増大や依存関係の複雑さが開発者の悩みの種となります。ここで登場するのが lernaturbo です。

両者はともにモノレポを支える重要なツールですが、その「役割」と「得意分野」は明確に異なります。lerna はモノレポの「バージョン管理と公開」に焦点を当てたベテランであり、turbo は「タスク実行の高速化」に特化した新星です。この違いを理解せず選定すると、プロジェクトの成長とともに運用コストが膨らむ可能性があります。

🎯 根本的な役割の違い:何を解決するのか

まず押さえるべきは、両者が解決しようとしている本質的な課題の違いです。

lerna は、主に「複数のパッケージのバージョンをどう管理し、どう公開するか」を解決します。

  • 複数のパッケージのバージョン番号を同期(固定モード)または個別管理(独立モード)できます。
  • 変更があったパッケージを自動的に検出し、npm への公開プロセスを自動化します。
  • 長年愛されてきた標準的なツールですが、近年はビルド機能よりも「リンク」や「公開」の機能に注力しています。
// lerna.json の設定例
{
  "$schema": "node_modules/lerna/schemas/lerna-schema.json",
  "version": "1.0.0",
  "packages": ["packages/*"]
}

turbo は、主に「タスク(ビルド、テストなど)をいかに速く実行するか」を解決します。

  • 実行したタスクの結果をキャッシュし、変更がない限り再実行しません。
  • 複数のパッケージのタスクを並列かつ効率的に実行します。
  • パッケージの公開機能は持たないため、公開には npm や pnpm の標準コマンド、あるいは他のツールを使います。
// turbo.json の設定例
{
  "$schema": "https://turbo.build/schema.json",
  "pipeline": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**"]
    },
    "test": {
      "dependsOn": ["build"]
    }
  }
}

⚡ ビルドとタスク実行:キャッシュと並列処理

現代のモノレポ開発で最も重要なのが、いかに無駄なビルドを省き、フィードバックループを短くするかです。この点において、両者のアプローチは対照的です。

lerna は、タスクを複数のパッケージで並列に実行する機能(lerna run)を提供しますが、基本的には「その場での実行」が中心です。

  • 変更があったかどうかを判定してスキップする機能は限定的です。
  • 以前はビルド機能も強化されていましたが、現在はタスクランナーとしての機能は turbonx に譲る傾向にあります。
# lerna: 全パッケージで build スクリプトを並列実行
# キャッシュ機能は標準では提供されないため、毎回実行されます
npx lerna run build --parallel

turbo は、強力なリモートキャッシュとローカルキャッシュを備えています。

  • 入力(ソースコード、環境変数など)が同じであれば、ビルド結果をキャッシュから復元します。
  • CI 環境では、チームメンバーがローカルでビルドした結果を共有できるため、計算資源を大幅に節約できます。
  • 依存関係をグラフとして解析し、必要なタスクだけを順序立てて実行します。
# turbo: ビルドタスクを実行(キャッシュがあれば即座に完了)
# 依存するパッケージのビルドが完了するまで待機し、結果を再利用します
npx turbo run build

# ローカルキャッシュのヒット率を確認
# タスク実行後に Summary が表示されます

🔗 パッケージ間の依存関係解決

モノレポの利点である「パッケージ間の即時反映」をどう実現するかについても、両者は異なる方法を提供します。

lerna は、lerna bootstrap(または lerna link)コマンドにより、パッケージ間のシンボリックリンクを作成します。

  • これにより、あるパッケージが別のローカルパッケージを依存している場合、npm registry からダウンロードする代わりに、ローカルのソースを参照できます。
  • 開発中の即時反映に不可欠な機能ですが、近年のパッケージマネージャー(npm, yarn, pnpm)の機能向上により、この役割は徐々に移行しています。
# lerna: 依存関係をリンクして開発環境を準備
# 従来のワークスペース設定と組み合わせて使用されます
npx lerna bootstrap

# 現在では pnpm や npm の workspace 機能を使い、lerna はリンク処理のみを行うことも多いです

turbo は、依存関係の解決そのものよりも、依存関係を「理解してタスクを順序付ける」ことに長けています。

  • パッケージマネージャーのワークスペース機能(pnpm workspaces や npm workspaces)と併用するのが一般的です。
  • turbo 自体がリンクを作成するわけではなく、すでに解決された依存関係グラフをもとに、ビルド順序を最適化します。
# turbo: パッケージマネージャーがリンクを解決した状態で、タスクを実行
# turbo.json で "^build" と指定することで、依存パッケージのビルドを先に実行させます
{
  "pipeline": {
    "build": {
      "dependsOn": ["^build"]
    }
  }
}

📦 バージョン管理と公開(Publishing)

ここが両者の最大の分岐点です。パッケージを外部に公開する必要があるかどうかで、選択が大きく変わります。

lerna は、バージョン管理と公開のための包括的なコマンドを提供します。

  • lerna version:変更されたパッケージを検出し、バージョン番号を更新し、Git タグを作成します。
  • lerna publish:更新されたパッケージを npm registry に公開します。
  • 「固定モード(Fixed)」で全パッケージのバージョンを揃えるか、「独立モード(Independent)」でバラバラに管理するかを選べます。
# lerna: バージョンアップと公開を一度に実行
# 変更されたパッケージを自動的に検出し、ユーザーにバージョン選択を促します
npx lerna version
npx lerna publish from-git

# 独立モードの場合、各パッケージが独自のバージョンを持ちます
# lerna.json で "version": "independent" と設定

turbo は、バージョン管理や公開機能を提供しません

  • これは設計上の選択であり、タスク実行の高速化に専念するためです。
  • 公開フローが必要な場合は、Changesets などの専用ツールや、npm/pnpm の標準コマンドを組み合わせる必要があります。
  • 最近のトレンドとして、「バージョン管理は Changesets、ビルドは Turbo、リンクは pnpm」という構成が人気です。
# turbo: 公開機能はないため、標準の npm publish または Changesets を使用
# タスクとして登録することは可能ですが、バージョン管理ロジックは含まれません
npm publish
# または
npx changeset publish

🛠️ 実戦での選び方:シナリオ別ガイド

実際のプロジェクトでは、どちらか一方だけを「絶対的な正解」として選ぶのではなく、課題に合わせて使い分ける、あるいは組み合わせることが重要です。

シナリオ A:ライブラリ開発チーム

複数の UI コンポーネントライブラリやユーティリティパッケージを開発し、定期的に npm へ公開しているチーム。

  • 推奨: lerna (または lerna + turbo
  • 理由: バージョンの同期と公開フローの自動化が不可欠だからです。ただし、ビルドが遅い場合は turbo を併用してビルドのみ高速化するというハイブリッド構成も有効です。

シナリオ B:大規模アプリケーション開発チーム

一つの巨大なアプリケーションを複数のチームで開発しており、ビルド時間の短縮が最優先課題。

  • 推奨: turbo
  • 理由: 外部への公開フローよりも、ローカルでの開発体験(DX)と CI の高速化が重要です。turbo のキャッシュ機能が開発者の待ち時間を劇的に減らします。

シナリオ C:モダンなスタートアップ

新規プロジェクトで、最新のベストプラクティスを採用したい。

  • 推奨: turbo + pnpm workspaces + changesets
  • 理由: 近年のコミュニティでは、役割を単一責任原則に基づいて分離する傾向があります。リンクは pnpm、ビルドは turbo、バージョン管理は changesets という構成が、最も柔軟で保守性が高いと評価されています。

📊 比較サマリー

機能lernaturbo
主目的バージョン管理と公開タスクの高速化とキャッシュ
ビルドキャッシュ標準では非対応(要設定)強力なローカル/リモートキャッシュ
タスク並列実行対応 (--parallel)対応(依存関係に基づく最適化)
バージョン管理内蔵 (lerna version)非対応(他ツールと併用)
パッケージ公開内蔵 (lerna publish)非対応
依存関係リンク内蔵 (bootstrap)パッケージマネージャーに委譲
設定ファイルlerna.jsonturbo.json

💡 結論:役割の分離へ

かつて lerna はモノレポの「すべて」を管理するスイスアーミーナイフのような存在でした。しかし、エコシステムが成熟するにつれ、役割は専門化されています。

もしあなたが「ビルドを速くしたい」のであれば、迷わず turbo を選んでください。その圧倒的なキャッシュ機能は、開発体験を一新します。

一方で、「複数のパッケージのバージョンを揃えて公開したい」という要件が強い場合は、依然として lerna が有力な選択肢です。ただし、将来的には changesets などのモダンなツールへの移行も視野に入れると、より柔軟なアーキテクチャを構築できるでしょう。

重要なのは、ツールに「すべて」を任せようとせず、それぞれの強みを組み合わせて、あなたのチームに最適なワークフローを構築することです。

選び方: turbo vs lerna

  • turbo:

    ビルド、テスト、lint などのタスク実行速度を最大化したい場合、そしてパイプラインのキャッシュ機能を活用して CI/CD コストを削減したい場合に turbo を選定すべきです。複数のパッケージが含まれる大規模なモノレポで、変更があった部分だけを効率的に処理したいチームに最適です。パッケージの公開機能自体には焦点を当てていないため、公開フローには別途標準的なツールやスクリプトを使用する前提となります。

  • lerna:

    複数の独立したパッケージを npm registry に公開する必要があり、バージョン番号を同期させて管理したい場合に lerna を選定すべきです。特に、従来の「バージョンアップ→タグ付け→公開」というワークフローを維持しつつ、パッケージ間の依存関係解決だけを支援させたいプロジェクトに適しています。ただし、ビルドの高速化やタスクの並列実行が主目的の場合は、他のツールとの併用が必要になる点に注意してください。

turbo のREADME

Turborepo

Turborepo is the build system for coding agents.

Getting Started

Visit https://turborepo.dev to get started with Turborepo.

Contributing

See CONTRIBUTING.md for more information.

Community

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.

Who is using Turborepo?

Turborepo is used by the world's leading companies. Check out the Turborepo Showcase to learn more.

Updates

Follow @turborepo on X for project updates.

Security

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.

https://security.vercel.com/