概要
サーバー + フロントといった別々のプロジェクトを一つのリポジトリで管理するような運用をモノレポ(モノリポ?)と呼びます。
今回はモノレポを最適化するツールの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に書くので途中から気にしなくなるが、こんなことが出来るのかというだけでも、コマンドやオプションの種類を知っておくのはとても大事。