npm workspaceの使い方
導入
モノリポ管理をするにあたって、npm workspacesが非常に使い勝手が良かったので、使い方をメモ
lernaによるモノリポ管理を考えていたが、エディタでの補完などの設定がどうにもうまくいかなかったため、上記のnpm workspacesの導入に至ったという経緯がある
npm workspaceのメリット
npm workspaceを使うことで管理下の依存関係をルートでのnpm installで一括でインストールできたり、それぞれのパッケージでテストを走らせたり、ビルドできたりする。
前提
npm: v7以上
導入方法
ルートディレクトリのpackage.jsonにprivate: true
を設定
新規パッケージを管理下に入れたい場合は下記コマンドを叩く
$ npm init -w packages/a
このコマンドによりnpm workspaceの管理下にパッケージが追加される
root
- package
- a
- package.json
こんな感じになる
既存のプロジェクトにnpm workspaceを導入する場合はpackage.jsonに下記を追加
"workspaces": [
"packages/a",
],
導入方法はこれだけです!!
使い方
依存関係の追加
管理している各パッケージで共通のパッケージをインストールしたいときはルートディレクトリにて依存関係を追加してください。
管理しているパッケージで固有で使用するようなパッケージの依存関係の追加は下記コマンドでOKです!
npm install -w 管理しているパッケージ名 --save インストールしたいパッケージ名
こうすることでルートのpackage-lock.jsonで各パッケージの依存関係を管理することができます。
間違えて管理パッケージ下でnpm install
してしまい、package-lock.jsonができてしまった場合はファイル削除、node_modulesの削除後ルートにてnpm install
すればOKです!
一括実行
管理しているパッケージでテストなどのコマンドを実行したいことがあると思います。
こんな時は--workspaces
をコマンドのパラメータに設定してください。
そうすると管理下のパッケージで一括実行できます!
linter, formatter
例えばESLintなどのLinterやPrettierなどのツールを使う場合、管理パッケージで
全て共通のルールを使いたい or 共通ルールは切り出しておきたい
ということがあると思います。
このような場合は、ルートにてESLint, Prettierを依存関係に追加する。
それぞれのツールの設定ファイルをルートディレクトリに配置しておく。
これで共通ルールの設定は完了です!
パッケージごとに個別の設定をしたい場合は
- ESLintの場合、パッケージ下にて設定ファイルを作成すれば、ルートの設定に上書きするような形でルールを設定できます。全く別のルールを設定したい場合は
root:true
をパッケージ下の設定ファイルに追加すればOK - Prettierの場合、パッケージ下にて設定ファイルを作成し、オプションに
"overrides": []
の設定を追加しておけば、ルートの設定をオーバーライドできます
注意点
依存関係の追加を行うとき管理しているパッケージ下にてnpm install --save
などするとpackage-lock.jsonが管理パッケージ下に作成されてしまう。
こうなると下記のような問題が発生するので、ルートのpackage-lockだけで管理するようにしましょう。(環境によって挙動が少し違うかもしれません)
- ルートディレクトリでのnpm installで一括インストールできない
- ルートと管理パッケージ下のnode_modulesの競合によりエディタがエラーを吐く
何か問題点等あれば、コメントをお願いいたします!
Discussion