モノレポ管理とは?Turborepoを選ぶ理由
複数のWebアプリケーションや社内システムを開発していると、「どのリポジトリに共通コードがあったか分からない」「同じ機能を何度も実装している」といった課題に直面します。
モノレポ(Monorepo)管理は、複数のプロジェクトを一つのリポジトリで一元管理する手法です。中小企業のIT担当者にとって、属人化の防止や開発効率の向上に有効なアプローチとして注目されています。
モノレポの基本概念とマルチレポとの違い
モノレポとは、複数のアプリケーションやライブラリを一つのバージョン管理システムで管理する手法です。従来のマルチレポ(プロジェクトごとに別リポジトリ)と比較して、以下のような構造になります。
my-monorepo/
├── apps/
│ ├── web-app/ # Webアプリケーション
│ ├── admin-panel/ # 管理画面
│ └── mobile-app/ # モバイルアプリ
├── packages/
│ ├── ui-components/ # 共通UIコンポーネント
│ ├── utils/ # 共通ユーティリティ
│ └── config/ # 共通設定
└── package.json
モノレポの主なメリット
- コードの共有が容易で、共通コンポーネントを即座に全プロジェクトで利用可能
- コーディング規約や設定を統一しやすく、一貫性を維持できる
- 変更の影響範囲が把握しやすく、複数プロジェクトにまたがる変更を一度に完了できる
- 一度のクローンで全プロジェクトの開発環境を構築可能
モノレポの注意点
- リポジトリサイズが大きくなり、クローン時間が増加する可能性
- アクセス権限をプロジェクトごとに分けにくい
- 適切なツールを使わないとビルド時間が増加
- モノレポ管理ツールの学習コストが発生
中小企業では、3つ以上の関連プロジェクトを管理している場合、モノレポ化による効率化のメリットが大きいと言えます。
モノレポ管理が向いているケース
以下のチェックリストで、自社のプロジェクトが向いているか確認してみましょう。
向いているケース
- ✅ 複数のアプリケーションで共通のUIコンポーネントやライブラリを使用
- ✅ フロントエンドとバックエンドを同じチームで開発
- ✅ 顧客向けサイトと管理画面など、関連性の高い複数システムを運用
- ✅ TypeScriptやReactなど、共通の技術スタックを使用
- ✅ 少人数のチームで複数プロジェクトを管理
具体的なプロジェクト例
- ECサイトと管理画面:商品情報の型定義、APIクライアント、バリデーションロジックを共有
- Webアプリとモバイルアプリ:ビジネスロジック、共通コンポーネントを共有
- 複数の社内システム:認証機能、ユーザー管理、共通UIライブラリを統一管理
Turborepoの特徴と選ぶべき理由
モノレポ管理ツールには、Turborepo、Nx、Lernaなどがありますが、Turborepoは初心者に優しく、学習コストが低いことで注目されています。Vercel社が開発・保守しており、特に高速なビルドとキャッシュ機能に優れています。
Turborepoの3つのコア機能
1. タスクのパイプライン管理
複数のプロジェクト間のビルド、テスト、リントなどのタスクを効率的に実行します。依存関係を理解し、並列実行可能なタスクは自動的に並列化します。
{
"pipeline": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**"]
},
"test": {
"dependsOn": ["build"]
}
}
}
2. インテリジェントなキャッシュ機能
一度実行したタスクの結果をキャッシュし、コードに変更がない場合は再実行をスキップします。これにより、ビルド時間を最大90%削減できる場合もあります。
# 初回実行
$ turbo run build
Tasks: 3 successful, 3 total
Time: 12.5s
# 2回目(変更なし)
$ turbo run build
Tasks: 3 successful, 3 total
Cached: 3 cached, 3 total
Time: 0.8s
3. リモートキャッシュの共有
チームメンバー間やCI/CD環境でキャッシュを共有できます。誰かが一度ビルドすれば、他のメンバーはそのキャッシュを利用できるため、チーム全体の生産性が向上します。
他のツールとの比較
| ツール | 学習コスト | ビルド速度 | 設定の複雑さ | 適したケース |
|---|---|---|---|---|
| Turborepo | 低い | 非常に速い | シンプル | 初めてのモノレポ、小〜中規模 |
| Nx | 高い | 速い | 複雑 | 大規模、エンタープライズ |
| Lerna | 中程度 | 普通 | 中程度 | npmパッケージの公開管理 |
Turborepoの優位性
turbo.json一つで主要な設定が完結- 既存プロジェクトへの段階的な導入が容易
- Vercelとの統合でデプロイ時のキャッシュ活用が簡単
- フレームワーク非依存で、Next.js、Vite、Remixなど、どのフレームワークでも使用可能
初心者におすすめな理由
最小限の設定で始められる
# プロジェクト作成
npx create-turbo@latest
わずか数行の設定で動作するモノレポが完成します。複雑な概念を理解しなくても、基本的な機能をすぐに使い始められます。
既存のツールチェーンをそのまま使える
TypeScript、ESLint、Prettierなど、既に使い慣れたツールをそのまま利用できます。新しいツールを覚える必要がありません。
段階的な導入が可能
既存のマルチレポ環境から、少しずつモノレポに移行できます。すべてを一度に変更する必要がないため、リスクを最小限に抑えられます。
Turborepoでモノレポ管理するメリット
コード共有と再利用性の向上
共通UIコンポーネントの一元管理
従来は各プロジェクトでコンポーネントをコピー&ペーストし、デザイン変更時に複数箇所を修正する必要がありました。Turborepoでは、共通コンポーネントをpackages/uiとして管理し、両方のアプリから参照できます。
// packages/ui/src/Button.tsx
export const Button = ({ children, onClick }) => {
return <button onClick={onClick}>{children}</button>
}
// apps/web/src/pages/index.tsx
import { Button } from '@mycompany/ui'
// apps/admin/src/pages/dashboard.tsx
import { Button } from '@mycompany/ui'
デザイン変更はpackages/uiだけで行えば、すべてのアプリに自動的に反映されます。
型定義の統一
TypeScriptの型定義を共有することで、フロントエンドとバックエンドの型の不一致を防げます。
// packages/types/src/user.ts
export interface User {
id: string
name: string
email: string
}
実際の導入事例では、共通コンポーネントの再利用率が60%向上し、新機能開発のスピードが40%短縮されました。
一貫した開発環境の維持
統一された設定管理
TypeScript、ESLint、Prettierの設定を一箇所で管理できます。
// packages/tsconfig/base.json(共通設定)
{
"compilerOptions": {
"strict": true,
"esModuleInterop": true
}
}
// apps/web/tsconfig.json(継承して使用)
{
"extends": "@mycompany/tsconfig/base.json"
}
メリット
- 新メンバーのオンボーディングが簡単(一度の環境構築で全プロジェクトに参加可能)
- コードレビューの基準が統一され、チーム全体で同じ品質基準を維持
- 設定やツールが統一されることで、属人化を防止
注意すべきデメリットと対策
リポジトリサイズの増加
すべてのプロジェクトを一つのリポジトリに含めるため、リポジトリのサイズが大きくなります。
対策
- Git LFSを使用して大きなバイナリファイルを管理
- Shallow Cloneでクローン時間を短縮:git clone --depth 1
- 不要なファイルを.gitignoreに適切に追加
初期学習コスト
チームメンバーがモノレポの概念やTurborepoの使い方を学ぶ必要があります。
対策
- まず小規模なプロジェクトで試す段階的な導入
- 社内向けのセットアップガイドを作成
- 経験者と未経験者でペアプログラミング
- 定期的な勉強会でチーム内で知識を共有
アクセス権限の管理
一つのリポジトリに全コードがあるため、プロジェクトごとの権限分離が難しくなります。
対策
- ブランチ保護ルールで重要なディレクトリへの変更にはレビューを必須化
- CODEOWNERSファイルでディレクトリごとに責任者を明確化
- セキュリティ要件が厳しい場合は無理にモノレポ化しない
Turborepoの環境構築と初期設定
必要な環境とツールの準備
Turborepoを始めるには、以下の環境が必要です。
- Node.js:v18.0.0以上(推奨:v20以上)
- パッケージマネージャー:npm、yarn、pnpmのいずれか
- Git:バージョン管理用
Turborepoプロジェクトの作成手順
1. プロジェクトの作成
npx create-turbo@latest
対話形式で以下の質問に答えます。
- プロジェクト名
- パッケージマネージャーの選択(npm/yarn/pnpm)
- テンプレートの選択(基本/Next.js/Remixなど)
2. プロジェクト構造の確認
my-turbo-app/
├── apps/
│ ├── web/ # Next.jsアプリ
│ └── docs/ # ドキュメントサイト
├── packages/
│ ├── ui/ # 共通UIコンポーネント
│ ├── eslint-config/ # ESLint設定
│ └── typescript-config/ # TypeScript設定
├── turbo.json # Turborepo設定
└── package.json
3. 依存関係のインストール
cd my-turbo-app
npm install
4. 開発サーバーの起動
npm run dev
すべてのアプリケーションが同時に起動します。
turbo.jsonの基本設定
turbo.jsonは、Turborepoの動作を制御する設定ファイルです。
{
"$schema": "https://turbo.build/schema.json",
"pipeline": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**", ".next/**"]
},
"dev": {
"cache": false,
"persistent": true
},
"lint": {
"dependsOn": ["^lint"]
},
"test": {
"dependsOn": ["build"],
"outputs": ["coverage/**"]
}
}
}
主要な設定項目
dependsOn:タスクの依存関係を定義(^buildは依存パッケージのビルドを先に実行)outputs:キャッシュ対象のファイルを指定cache:キャッシュの有効/無効persistent:開発サーバーなど、継続的に実行するタスクに指定
パッケージマネージャーの選び方
| パッケージマネージャー | 特徴 | 推奨ケース |
|---|---|---|
| npm | Node.js標準、安定性が高い | 初心者、安定性重視 |
| yarn | 高速、ワークスペース機能が充実 | チーム開発 |
| pnpm | 最も高速、ディスク容量を節約 | 大規模モノレポ |
推奨:pnpm
モノレポ管理では、pnpmが最も効率的です。
npm install -g pnpm
pnpm create turbo@latest
Turborepoでの実践的なモノレポ管理
ワークスペースの構成とディレクトリ設計
基本的なディレクトリ構成
my-monorepo/
├── apps/ # アプリケーション
│ ├── web/ # 顧客向けWebサイト
│ ├── admin/ # 管理画面
│ └── api/ # バックエンドAPI
├── packages/ # 共通パッケージ
│ ├── ui/ # UIコンポーネント
│ ├── utils/ # ユーティリティ関数
│ ├── types/ # TypeScript型定義
│ └── config/ # 共通設定
└── turbo.json
package.jsonでのワークスペース定義
{
"name": "my-monorepo",
"private": true,
"workspaces": [
"apps/*",
"packages/*"
]
}
共通ライブラリの管理方法
共通UIコンポーネントパッケージの作成
cd packages
mkdir ui
cd ui
npm init -y
// packages/ui/package.json
{
"name": "@mycompany/ui",
"version": "0.0.0",
"main": "./src/index.tsx",
"types": "./src/index.tsx",
"dependencies": {
"react": "^18.2.0"
}
}
アプリケーションからの利用
// apps/web/package.json
{
"dependencies": {
"@mycompany/ui": "*"
}
}
// apps/web/src/pages/index.tsx
import { Button } from '@mycompany/ui'
タスクのパイプライン設定とキャッシュ活用
効率的なパイプライン設定
{
"pipeline": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**", ".next/**", "build/**"]
},
"test": {
"dependsOn": ["build"],
"outputs": ["coverage/**"],
"inputs": ["src/**/*.tsx", "src/**/*.ts", "test/**"]
},
"lint": {
"outputs": []
}
}
}
特定のアプリのみ実行
# webアプリのみビルド
turbo run build --filter=web
# webアプリとその依存関係をビルド
turbo run build --filter=web...
運用フェーズで押さえておきたいポイント
チーム開発でのルール作り
CODEOWNERSファイルの設定
# .github/CODEOWNERS
/apps/web/ @frontend-team
/apps/api/ @backend-team
/packages/ui/ @design-system-team
コミットメッセージの規約
feat(web): ログイン機能を追加
fix(ui): ボタンのスタイル修正
docs(readme): セットアップ手順を更新
リモートキャッシュの活用方法
Vercelアカウントでのリモートキャッシュ設定
# Vercelにログイン
npx turbo login
# リモートキャッシュをリンク
npx turbo link
// turbo.json
{
"remoteCache": {
"signature": true
}
}
これにより、チームメンバー全員がキャッシュを共有し、ビルド時間を大幅に短縮できます。
よくあるエラーと対処法
エラー1:キャッシュが効かない
原因:環境変数が変更されている
対処法:
{
"pipeline": {
"build": {
"env": ["NODE_ENV", "API_URL"]
}
}
}
エラー2:依存関係の解決に失敗
原因:パッケージ名の不一致
対処法:package.jsonのnameフィールドを確認し、一貫性を保つ
モノレポ管理の改善サイクル
月次メンテナンス
- 依存パッケージの更新
- 不要なコードの削除
- ドキュメントの更新
- ビルド時間のモニタリング
パフォーマンス測定
# ビルド時間の測定
turbo run build --summarize
# キャッシュヒット率の確認
turbo run build --dry-run
まとめ:自社に合ったモノレポ管理を始めよう
Turborepoモノレポ管理の始め方ステップ
- 現状の把握:管理しているプロジェクト数と関連性を確認
- 小規模な試験導入:2〜3の関連プロジェクトで開始
- チーム内での知識共有:勉強会やドキュメント整備
- 段階的な拡大:成功事例をもとに他プロジェクトへ展開
- 継続的な改善:定期的なメンテナンスとパフォーマンス測定
小規模から始める段階的導入のすすめ
最初から全プロジェクトをモノレポ化するのではなく、以下のような順序で進めましょう。
フェーズ1(1〜2ヶ月)
- 顧客向けサイト + 管理画面の2プロジェクトで開始
- 共通UIコンポーネントの抽出
フェーズ2(3〜4ヶ月)
- モバイルアプリの追加
- 共通ユーティリティ関数の整理
フェーズ3(5〜6ヶ月)
- すべての関連プロジェクトを統合
- リモートキャッシュの本格活用
困ったときの相談先・サポート体制
公式リソース
- Turborepo公式ドキュメント
- GitHubディスカッション
外部サポートの活用
社内リソースだけで難しい場合は、外部の専門家に相談することも有効です。Harmonic Societyでは、中小企業向けにモノレポ導入支援サービスを提供しています。
- 初期セットアップの支援
- チームメンバーへのトレーニング
- 運用フェーズでの技術サポート
「ちょうどいい」規模と複雑さで、無理なく導入できる体制づくりをお手伝いします。
Turborepoによるモノレポ管理は、中小企業の開発効率を大きく向上させる可能性を秘めています。まずは小さく始めて、自社に合った形で育てていきましょう。