モノレポ

複数のプロジェクトやパッケージを 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

npm workspaces の例を示す。

{
  "name": "my-monorepo",
  "workspaces": ["packages/*"],
  "scripts": {
    "build": "turbo build",
    "test": "turbo test",
    "lint": "turbo lint"
  }
}

Turborepo

Turborepo の例を示す。

{
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**"]
    },
    "test": {
      "dependsOn": ["build"]
    }
  }
}

Turborepo はタスクの依存関係を解析し、キャッシュと並列実行で高速化する。

モノレポのツール

モノレポのツールを以下に示す。

ツール特徴
Turborepo高速ビルド、キャッシュ
Nxプラグインエコシステム
Lernanpm パッケージ公開
pnpm workspaces高速なパッケージマネージャ

CI/CD での影響範囲の検出

CI/CD での影響範囲の検出の例を示す。

# GitHub Actions: 変更されたパッケージのみビルド
- run: npx turbo build --filter=...[HEAD~1]

全パッケージをビルドするのではなく、変更されたパッケージとその依存先のみをビルドする。

いつモノレポを使うか

選択の軸は、変更が複数パッケージにまたがる頻度と、リポジトリを大きくした代償を引き受けられるかどうかである。

場面判断理由
フロントエンド・バックエンド・共通の型定義を一緒に育てるモノレポ型を変えた影響を 1 つの PR で全利用側まで直せ、パッケージを公開してからバージョンを上げる往復が消える
小規模チーム (1〜5 人) で全員が全領域を触るモノレポ一元管理された依存とルートの turbo test で全体を一度に検証でき、リポジトリを行き来する切り替えコストが減る
各サービスが独立してリリースされ、共有コードもほぼないポリレポ一緒に置く利点が薄い一方、モノレポでは影響範囲の検出を CI に組み込まないと無関係なビルドまで走る
大規模組織 (100 人以上) で同じ場所に集約したい段階的に判断リポジトリの履歴とビルド対象が膨らみ、影響範囲の検出とキャッシュを整えないと CI 時間が伸び続けるため、まず数チームで試してから広げる

体系的に学ぶなら関連書籍を参照してほしい。

この記事は役に立ちましたか?

関連用語

関連する記事