Skip to content

Instantly share code, notes, and snippets.

@pipopotamasu
Last active January 19, 2023 09:21
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pipopotamasu/efe7097454d9668f80cd8b43068afafc to your computer and use it in GitHub Desktop.
Save pipopotamasu/efe7097454d9668f80cd8b43068afafc to your computer and use it in GitHub Desktop.

モノレポとは何か?

複数プロジェクトのコードベースを同一レポジトリで管理すること。またはその管理下における開発手法のこと。 プロジェクトは相互依存可能で、プロジェクト間のコード共有もできる。

構成例(プロジェクト名: example)

./
  .git/
  example-backend   // バックエンドAPI
  example-admin     // 管理画面
  example-algorithm // 機械学習系のコード
  example-frontend  // フロントエンド
  example-lp        // LP
  ...

モノレポのメリット

  • 全てのコードベースを単一レポジトリで管理できる
  • コードの再利用がしやすい
    • graphqlとかOpen APIとかProtocol Buffersとかスキーマ駆動のツールとかと相性がいい
    • もちろん子プロジェクト間で同じ言語を使用していればコードをそのまま流用できる
  • 他の子プロジェクトが何をやっているのかわかりやすい
  • 単一のlint、ビルド、テスト、リリースプロセスを設定しやすい
    • ただし同じ言語の子プロジェクトがあることが前提
  • CIが高速になる?
    • Monorepo != Monolithというモノレポの有名な記事に書いてあるのだが理由がよくわからん

モノレポのデメリット

  • CIの設定が面倒になる
  • あまり多くの子プロジェクトを詰めすぎると(というかファイル数が多すぎると)Gitのパフォーマンスが悪くなる
  • 子プロジェクトにアクセス(変更)権限を設定するのにひと頑張り必要
    • GitHubのようなレポジトリホスティングサービスを使うか、モノレポツールの機能を使うか
  • issueとかPRが大量に溢れる可能性がある(GitHubの場合)

モノレポをサポートするツール

どれもJS/TSプロジェクト用。

  • 複数のpackage.jsonを管理するためのyarnの機能
  • 複数のプロジェクトで共通のnpmパッケージを使用している場合、それぞれのプロジェクトにそれぞれinstallしているのではなく、パッケージのインストール自体は1回で依存するプロジェクトがそれを参照するようになる。
    • 例えば、 example-frontendとexample-lpでどっちもreactを使用している場合、reactのinstall自体は1回で済みexample-frontendとexample-lpはそのインストールされたreactを(おそらく)シンボリックリンクで参照するような感じになる
    • こうすることで、無駄にパッケージがインストールされるのを防ぐことができる
  • package.json内のバージョン指定も不整合が起きないようよしなに解決してくれる
  • モノレポの「ライブラリ」を効率的に扱うためのツール
    • babel, jest等の有名ライブラリに採用されている
    • アプリケーション用のツールではない
  • yarn workspaceの機能はカバーしている
  • モノレポ配下のパッケージを(例えばnpmレジストリに)公開する時に便利な機能がたくさんある
  • ただいまRustで書き換えているため更新が止まっている
  • これはやばい、公式の動画を見てやばさを実感した(いい意味で)
  • こちらはライブラリより「アプリケーション」のモノレポを効率的に開発することをフィーチャーした感じのツール
  • GoogleのAngularチームにいた人が、Googleの社内のモノレポを参考にして作ったらしい?
  • ボイラープレート用のコマンドが豊富で、コマンド一発でReact, Next.js, React Native等のプロジェクトが作れる
  • プロジェクト間で共有する共通関数やコンポーネントも簡単に作れる、storybookも自動生成できる
  • Nxが配下プロジェクトの依存関係を管理してくれているので、コードの変更を加えた時後テストコマンドを実行する時、他のプロジェクトに影響が及ぶ場合はそちらのテストも走らせてくれる。またプロジェクトの依存グラフもGUIでわかりやすく出してくれる
  • productionビルドも、ソースコードが変わっていない場合、Nxのキャッシュによってかなり早くビルドできる。テストも同様らしい。
  • 豊富なプラグインがある
    • storybookの自動生成など、さまざまなプラグインがあり機能追加ができる
  • マイクロソフト製なので、マイクロソフト系のプロダクトで使われている
  • 機能的にはNxと大体同じに見える
    • こっちはChange logの自動生成とかもできるっぽい
  • Nxほどプラグインが充実してない

参考文献

https://blog.nrwl.io/misconceptions-about-monorepos-monorepo-monolith-df1250d4b03c https://www.graat.co.jp/blogs/ck1099bcoeud60830rf0ej0ix

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment