モノレポ
複数のプロジェクトやパッケージを 1 つのリポジトリで管理する手法
開発ツールアーキテクチャ
モノレポとは
モノレポ (Monorepo) は、複数のプロジェクトやパッケージを 1 つの Git リポジトリで管理する手法である。Google、Meta、Microsoft が採用。対義語はポリレポ (Polyrepo)。
モノレポ vs ポリレポ
| 観点 | モノレポ | ポリレポ |
|---|---|---|
| コード共有 | 容易 (同一リポジトリ) | パッケージ公開が必要 |
| 依存管理 | 一元管理 | リポジトリごとに管理 |
| CI/CD | 変更影響の検出が必要 | リポジトリ単位で独立 |
| コードレビュー | 横断的な変更を 1 PR で | 複数リポジトリに PR |
| スケール | 大規模で遅くなる | リポジトリが増える |
ディレクトリ構成
my-monorepo/
├── packages/
│ ├── frontend/ # React アプリ
│ ├── backend/ # Lambda 関数
│ ├── shared/ # 共通の型定義・ユーティリティ
│ └── infra/ # CDK / SAM テンプレート
├── package.json # ルートの設定
└── turbo.json # Turborepo の設定
npm workspaces
{
"name": "my-monorepo",
"workspaces": ["packages/*"],
"scripts": {
"build": "turbo build",
"test": "turbo test",
"lint": "turbo lint"
}
}
Turborepo
{
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**"]
},
"test": {
"dependsOn": ["build"]
}
}
}
Turborepo はタスクの依存関係を解析し、キャッシュと並列実行で高速化する。
モノレポのツール
| ツール | 特徴 |
|---|---|
| Turborepo | 高速ビルド、キャッシュ |
| Nx | プラグインエコシステム |
| Lerna | npm パッケージ公開 |
| pnpm workspaces | 高速なパッケージマネージャ |
CI/CD での影響範囲の検出
# GitHub Actions: 変更されたパッケージのみビルド
- run: npx turbo build --filter=...[HEAD~1]
全パッケージをビルドするのではなく、変更されたパッケージとその依存先のみをビルドする。
いつモノレポを使うか
| ケース | 推奨 |
|---|---|
| フロントエンド + バックエンド + 共通型 | モノレポ |
| 独立したマイクロサービス | ポリレポ |
| 小規模チーム (1〜5 人) | モノレポ |
| 大規模組織 (100 人以上) | 要検討 |
体系的に学ぶなら関連書籍を参照してほしい。