概要
サーバー + フロントといった別々のプロジェクトを一つのリポジトリで管理するような運用をモノレポ(モノリポ?)と呼びます。
今回はモノレポを最適化するツールのLernaを使って、運用している全てのプロジェクトのプロジェクトへのnpm installを一括で実行する時の話です。
私の場合はCIで回す時に必要になりました。
結論
lerna execコマンドを使いましょう。
以下のようなディレクトリ構成の場合、ルートディレクトリでlerna exec npm installを実行すると、frontとserver両方のnpm installが実行されます。
├──packages
│ ├── front
│ │ ├── package-lock.json
│ │ ├── package.json
│ │ ...
│ └── server
│ ├── package-lock.json
│ ├── package.json
│ ...
├── package-lock.json
├── package.json
├── lerna.json
...
もう少し詳しく...
lernaが用意している各パッケージでコマンドを実行するためのコマンドには以下の二つがあります。
-
lerna exec- 全てのパッケージで任意のコマンドを実行する
-
npm runコマンドを実行することも出来るので、lerna runをこちらに置き換えることも可能(意味はないけど) - npm installの他にrmなどで使用
-
lerna run- 全てのパッケージでnpm script を実行する
- testやbuildなどで使用
また、どちらのコマンドもオプションがかなり共通しています。
-
--scope- 指定されたパッケージの処理だけを実行する
-
--stream- 出力をストリーミングしてログを出力する
-
--parallel-
--streamと同じくログを出力するが、--streamと違って順番に実行するのではなく、 一気に全パッケージの処理を実行する - 危険なので、watch系のコマンドでしか使わないか、
--scopeである程度の制限をする
-
-
--no-bail- 途中でエラー終了コードが出た場合でも、無視して最後までコマンドを実行する
-
--no-prefix-
--streamや--parallelと一緒に使用 - パッケージ名のプレフィックスを無効化して、ログを出力する
-
-
--profile- コマンドの実行をプロファイルする
-
--profile-location <location>- プロファイル出力の場所を指定する
最後に
記事を調べているとあまり見つからなかったが、公式のREADMEを見たら簡単に解決したというオチ。
基本的にnpm scriptに書くので途中から気にしなくなるが、こんなことが出来るのかというだけでも、コマンドやオプションの種類を知っておくのはとても大事。