モノレポ?いらんでしょ
と、ちょっと挑発的なタイトルにしてみましたが、いかがでしょうか。
今までモノレポに対する話題を上げることは避けていたのですが。
今回はモノレポに対する、個人的な意見をだらだらーっと書いていこうと思います。
先に結論から書いてしまうと。
タイトルの通り、個人的にはどちらかといえばモノレポ反対派です。
とはいえあたりまえですがケースバイケースだと思っていて。
もちろん有用なケースもあると思いますので、全面的に導入を反対する気は毛頭ないです。
ただメリットをデメリットが上回るケースで導入するのはアホだよね、と個人的には思っています。
あと、日本ではなぜかやたらとモノレポを持ち上げる記事が目につく一方、デメリットについてしっかりと触れられている記事が少ないなと思います、あくまで個人的にですが。
まず、モノレポを導入することによって得られるメリットって以下のような感じかなーと思います。
- 複数のリポジトリを管理する必要がなくなる
- リンターやフォーマッターなどを、同じバージョンかつ同じ設定で使用できる
逆にデメリットとしては以下のような感じかなと。
- 自分が関わらないコードも自分の環境下に置くこととなる
- 自分に関係のないコミットが打たれる
- パッケージ間の依存関係が大量に発生する
- 関わるメンバー全員にモノレポの知識が求められる
ビルドやデプロイ周りについては設定でどうとでもなるので、知識さえあれば問題にならない認識です。
モノレポで有名なパブリックリポジトリの 1 つに react が挙がると思います。
上記のモノレポは非常に綺麗に作られています。
親がビルド、リンター、テスト、フォーマッターの管理を担い、各パッケージにはパッケージの実装とテストコードのみ書かれています。
こういうモノレポは個人的に好感が持てますし、プロジェクト自体破綻しづらそうだなーと思います。
一方で日本では、どちらかといえばパッケージ開発ではなく Web 開発のほうでよく導入される印象があります。
ただ個人的に、パッケージ開発のモノレポと Web 開発のモノレポでは、そもそもモノレポの導入難易度がまったく異なると思っていて。
Web 開発のモノレポってぶっちゃけめっちゃ難しいと思います、そもそもなんでモノレポ化する必要があるの?と、本末転倒なケースもちょくちょく目にしてきました。
Web 開発におけるモノレポ化によって得たいメリットを今一度考えてみると、結局パッケージ開発のときとさほど変わらないのかな?と思います。
加えて、Web 開発の場合は加えて以下のメリットも享受したいですよね。
- フロントとバックエンド間のスキーマを共有したい
- E2E のテストコードを別パッケージで管理したい
- 同じバックエンドを持つ複数の Web サービスを同時に管理したい
で、メリットに共通化していることは「処理をシンプルにしたい」ということが言えると思っていて。
たとえばリンターであれば、各々のリポジトリで毎回リンターの設定を書き換えたくないからモノレポにしたいわけで。
E2E のテストコードであれば、異なるパッケージで各々必要なパッケージのみをインストールをするに留まるので、見通しがぐっと良くなります。
結局どれもこれもシンプルに開発を行うためモノレポ化するに過ぎないと思っていて、それこそがモノレポによって得られるメリットなのかなーと思います。
モノレポ化する以上、リポジトリをシンプルな構成にする必要が出てくるのは言うまでもありません。
たまーにスキーマを共通化するためだけにモノレポを導入したい!と言う人を目にしますが、それではモノレポのメリットはあまり享受できません。
モノレポ化することによって ci の調整は必須となりますし、ブランチの持ち方も考えなければいけなくなります。
また下手なコードの共通化はプロジェクトの保守性を大きく下げる危険性もあります。
『フロントとバックエンドで言語が違うけどとりあえずモノレポにしよう!』というのは愚策でしかありません。
複数の言語にまたがった Issue や PR が並ぶような状態は避けるべきですし、なによりシンプルからはかけ離れていますよね。
またフロントとバックエンドの境目が非常に曖昧になるため、Issue や PR の粒度が荒くなり、これもまたプロジェクトの保守性を大きく下げる危険性があります。
Web 開発でモノレポを導入する場合は、個人的には無理をしないことが大切だと思います。
下手に共通化することは考えず、パッケージ開発のときと同様、まずはリンターやフォーマッターの共通化くらいから話を進めていくのが良いと思います。
これはよく言われていることですが。
メニレポからモノレポにするのは簡単ですが、逆にモノレポからメニレポにするのは非常に難しいです。
モノレポにすべきかどうか悩んだ場合は、まずはメニレポで開発を行い、同じような設定を何度も書くようになってきたら改めてモノレポを考慮するのが良いと思います。
モノレポを導入すべきか否はプロジェクトの規模感によりません、大規模か小規模かではなく、モノレポが最適なケースで導入することが重要だと思います。
それでもまだピンと来ないようであれば、おそらくモノレポを導入するにはまだ早いんだと思います。
逆に『モノレポを導入すべきかも』と思った方は、ぜひ Nx から入っていみるのが良いと思います。
モノレポはモノレポが必要な場合のみ導入するようにして、必要なければ導入しないよう心がけましょう。