単一リポジトリで複数package|projectを管理することをmonorepoというそう
きっかけ
で知りました。
BabelやReactのGithubのリポジトリは単一のリポジトリ内に複数のpackageを入れているとのこと
https://github.com/babel/babel/tree/master/packages
とか
https://github.com/facebook/react/tree/master/packages
みたいに。
このように単一リポジトリで複数のpackage|projectを管理するやり方を"monorepo"というらしい。
メリット?
上記QiitaのBabelドキュメントの日本語訳を引用させていただくと、メリットの方が多そうに見えます。
lint, build, test, release のプロセスを共通化できる
package をまたがった修正が容易になる
issue 管理を一元化できる
開発環境の構築が簡単になる
テストも package をまたいで実行でき、複数 package が絡む不具合の検知が容易になる
自分も上記メリットはあるなと以前から思っていたので、local moduleとlinklocalを組み合わせて1つのリポジトリ内で複数packageの管理をしようと試行錯誤したりしました。
デメリット?
Babelのドキュメント曰く
- 見た目ごっつくなる
- サイズがでかくなる
くらいしか問題はないという感じでしたが、
↓の記事を読むに、リポジトリがでかくなり過ぎると、Githubとかで問題起きそうですね。
monorepo構成でのNode.jsの開発を回すツール
BabelはLernaというツールを使って管理しているそう。
Lernaはシンボリックリンクを張るのではなく、node_modules配下をゴニョゴニョして依存解決をしているよう。
が、自分はnpmのlocal module + linklocal管理の方がよいのではと思ってます。
理由は
- なるべく公式に提供されている機能(=npm)で実現したい
- npmがlocal moduleとnpm linkまわりの改善をロードマップにひいているので、そのうちlinklocal使わなくて良くなるかも
という感じ。
まとめ + 補足
と、monorepo推しでまとめるかと思いきや、自分は何でもかんでも全部一つのリポジトリに突っ込むのに賛成はしないかも。
例えば、クライアントはフロントエンドエンジニアがUnityで作っていて、サーバはバックエンドエンジニアがNode.jsで作っているとか、専門分野によってチームが分かれている場合はリポジトリもチーム毎に存在していた方がやりやすいんじゃないかと思います。
ケースバイケースで最適な感じにリポジトリも分割するべきという、まとめにならないまとめで終わりにしたいと思います😜