Monorepo

モノレポ

モノレポを分かりやすく

モノレポは、英語の "Monolithic Repository" の略で、直訳すると "一枚岩のリポジトリ" となります。これは、複数のプロジェクトやパッケージを一つのリポジトリで管理するソフトウェア開発の構成パターンのことを指します。

具体的な例えをすると、モノレポは大きな倉庫のようなもので、その中に色々な商品(プロジェクトやパッケージ)が入っています。それぞれの商品は独立して存在し、それぞれ異なる機能や役割を持っていますが、一つの倉庫(リポジトリ)で一元管理されているというイメージです。

モノレポの歴史的変遷

モノレポの概念は、大規模なソフトウェア開発プロジェクトが増えてきたことにより、2000年代後半に出てきました。それまでのソフトウェア開発では、各プロジェクトが独立したリポジトリで管理されていました。しかし、これが大規模化すると、プロジェクト間の依存関係の管理やバージョン管理が困難になりました。そこで、一つのリポジトリで複数のプロジェクトを管理するモノレポのアイデアが生まれました。

最初にモノレポを採用したのは、GoogleやFacebookなどの大手テクノロジー企業でした。彼らは大量のコードとプロジェクトを効率的に管理するために、この新しい構成を採用しました。

モノレポを使うメリット

コード共有が容易

モノレポでは、一つのリポジトリ内で複数のプロジェクトを管理するため、共通のコードをパッケージとして分けて管理し、それを各プロジェクトで利用することが容易になります。

依存関係の管理が一元化

各プロジェクトの依存関係を一つのリポジトリで一元管理するため、パッケージのバージョンアップや更新作業が容易になります。

テストとデプロイが効率化

全てのプロジェクトが一つのリポジトリに存在するため、一度のテストやデプロイで全てのプロジェクトをカバーすることが可能になります。

モノレポの構成

モノレポの一般的な構成は以下のようになります。

root-directory (リポジトリのルートディレクトリ)
|
├── packages (各パッケージを格納するディレクトリ)
│   ├── package1 (パッケージ1)
│   │   ├── src
│   │   ├── test
│   │   └── package.json
│   ├── package2 (パッケージ2)
│   │   ├── src
│   │   ├── test
│   │   └── package.json
│   └── package3 (パッケージ3)
│       ├── src
│       ├── test
│       └── package.json
├── package.json (ルートのpackage.json。全体の設定やスクリプトを記述)
└── lerna.json (Lernaを使用している場合、その設定を記述)

この例では、各パッケージ(package1, package2, package3)は独立したプロジェクトとして扱われます。それぞれのパッケージは独自のsrcディレクトリとtestディレクトリ、そしてpackage.jsonを持っています。

ルートディレクトリには、全体の設定を記述するpackage.jsonがあります。また、モノレポの管理ツールであるLernaを使っている場合にはlerna.jsonが存在します。

モノレポの構成は、このように一つのリポジトリで複数のパッケージを管理することを可能にします。これにより、各パッケージの依存関係やバージョン管理、テスト、デプロイといった作業を効率的に行うことができます。

モノレポを学ぶ

以下のリストは、モノレポを学ぶ上で役立つ権威あるサイトのリンクです。

タイトル 説明
Monorepos in Git Atlassianによるモノレポに関する詳細なチュートリアルとガイドです。
Advantages of monorepos Mediumの記事で、モノレポのメリットを具体的な例を交えて説明しています。
Why Google Stores Billions of Lines of Code in a Single Repository Googleがモノレポを採用する理由について説明している記事です。