Chuyển đến nội dung chính

レッスン 23: モノリポジトリとマルチリポジトリ — ソース コードの構成

マイクロサービス + マイクロ フロントエンドのモノリポジトリとマルチリポジトリを比較します。 Turborepo、Nx ワークスペースのセットアップ。共有パッケージ管理。コードの所有権 (CODEOWNERS)。依存関係管理戦略。

🏗️ アーキテクチャ — レッスン 23 Lesson 23: Mono-Repo vs Multi-Repo — Source コード構成

マイクロサービスとマイクロ フロントエンドのシステム設計 — 基本から運用まで

パート 8: CI/CD および導入戦略

xdev.asia

はじめに

ソース コードの編成方法によって、開発者のエクスペリエンス、CI/CD の複雑さ、チームのコラボレーションが決まります。この記事では、モノリポジトリとマルチリポジトリを比較し、適切なリポジトリを選択するためのガイダンスを提供します。

モノリポジトリとマルチリポジトリ — コード管理戦略の比較


1. マルチリポジトリ

1.1 モデル

github.com/company/
├── product-service/       (repo riêng)
├── order-service/         (repo riêng)
├── cart-service/          (repo riêng)
├── product-mfe/           (repo riêng)
├── cart-mfe/              (repo riêng)
├── shell-app/             (repo riêng)
├── shared-ui/             (repo riêng, npm package)
└── shared-types/          (repo riêng, npm package)

1.2 利点と欠点

利点デメリット
所有権を明確にする共有コードは管理が難しい (npm pub)
独立した CI/CDリポジトリ間の複雑な変更
小さいリポジトリ = 高速クローン依存関係のバージョンのドリフト
きめ細かいアクセス制御一貫性を強制するのは難しい

2. モノリポジトリ

2.1 モデル

github.com/company/platform/
├── apps/
│   ├── shell-app/
│   ├── product-mfe/
│   ├── cart-mfe/
│   └── order-mfe/
├── services/
│   ├── product-service/
│   ├── order-service/
│   └── cart-service/
├── packages/
│   ├── shared-ui/
│   ├── shared-types/
│   └── eslint-config/
├── turbo.json / nx.json
└── package.json (workspace root)

2.2 利点と欠点

利点デメリット
Shared code easily (internal packages)大規模なリポジトリ → クローンが遅い
Atomic cross-package changesCI の複雑さ (影響を受ける検出)
一貫したツールと構成粗粒度のアクセス制御
リファクタリングは簡単ですBuild time long (need caching)

3. 意思決定マトリックス

係数マルチリポジトリモノリポジトリ
チームの規模50 人以上の開発者、多くのチーム< 50 人の開発者、少数のチーム
共有コードあまり共有されていない多くの共有パッケージ
Deploy independence✅ ナチュラル✅ 影響を受けた検出を使用する
横断的な変更❌ 複数の PR✅ シングル PR
CI/CDリポジトリごとの単純な複雑だが強力
オンボーディング簡単 (1 サービス/リポジトリ)中 (大規模なリポジトリ)

4. モノリポジトリツール

4.1 ターボレポ

// turbo.json
{
  "pipeline": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**", ".next/**"]
    },
    "test": {
      "dependsOn": ["build"]
    },
    "lint": {}
  }
}
# Build chỉ affected packages
turbo build --filter=...[origin/main]

# Build product-mfe và dependencies
turbo build --filter=product-mfe...

4.2 Nx

# Affected commands (chỉ build/test code thay đổi)
nx affected --target=build --base=main
nx affected --target=test --base=main

# Dependency graph
nx graph

4.3 主な機能

|特長 |ターボレポ | Nx | |----------|----------||-----| | 影響を受けた検出 | ✅ Git ベース | ✅ 依存関係グラフ | | リモート キャッシング | ✅ ヴェルセル | ✅ Nxクラウド | | タスク オーケストレーション | ✅ パイプライン | ✅ タスクグラフ | | コード生成 | ❌ | ✅ 発電機 | | プラグイン エコシステム |限定 |リッチ (React、Node など) |


5. コードの所有権 (CODEOWNERS)

# .github/CODEOWNERS
apps/product-mfe/    @team-product
apps/cart-mfe/       @team-cart
services/product-*/  @team-product
services/order-*/    @team-order
packages/shared-ui/  @team-platform
packages/shared-*/   @team-platform
turbo.json           @team-platform

→ PR は、変更されたファイルに基づいてレビュー担当者を自動的に割り当てます。


6. 推奨事項

E-Commerce Platform (series này):

Mono-Repo (Turborepo):
├── apps/           (Shell + MFEs)
├── services/       (Microservices)
├── packages/       (shared-ui, shared-types, eslint-config)
└── infra/          (Terraform, K8s manifests)

Lý do:
- Nhiều shared code (UI, types, configs)
- Cross-cutting changes thường xuyên
- Lợi ích từ affected detection & remote caching
- Team size < 50 devs

概要

  • マルチリポジトリ: 明確な所有権、シンプルな CI、ただしコードの共有は困難
  • モノリポ: コードの共有が簡単、アトミックな変更、ツールが必要 (Turborepo/Nx)
  • 影響を受ける検出 + リモート キャッシュには Turborepo/Nx を使用します
  • CODEOWNERS モノリポジトリ内のコード所有権

次の記事: レッスン 24: マイクロサービスおよびマイクロ フロントエンド用の CI/CD パイプライン