結論
node_modulesの中身を確実にdependenciesのみにしたい場合
- npm v6 の場合 →
npm prune --production
- npm v7 ~ の場合 →
npm i --production
→ npm v6の場合、npm i --production
では、インストール済みのdevDependenciesのパッケージが削除される訳ではないことに注意
経緯
AWS Lambdaのレイヤーとしてアップロードしたいパッケージ群があり、以下のような流れでインストールしたい状況がありました。
- devDependenciesのパッケージも含めて全てインストールし、関数をビルドする。
- node_modules内を、実行時に必要なdependenciesのパッケージのみにしてzip化する。
この時、2の段階で npm i --production
を行なった場合、npmがv6かv7以降かによって結果が異なるようです。
npm v6の場合
v6で npm i --production
を行うと、新たにインストールされるパッケージはdependenciesに記載のもののみになりますが、既にインストールされているdevDependenciesのパッケージが削除される訳ではないようです。
既にインストールされたdevDependenciesのパッケージを削除したい場合は、 npm prune --production
というコマンドが利用できます。
コマンドの説明では、devDependenciesのパッケージを削除するとありますが、dependenciesのパッケージがインストールされていない場合はそのインストールも同時に行ってくれるようです。
したがって、node_modulesの中身を確実にdependenciesのパッケージのみにしたい場合は、 npm prune --production
を実行するだけで十分なようです。
npm v7以降の場合
v7, v8では、npm i --production
を行うと、dependenciesのパッケージのみインストールされ、既にインストールされたdevDependenciesのパッケージの削除まで行ってくれるようです。
これは実質的に npm prune --production
と同じ挙動になっているようです。
所感
dependenciesのみをインストールしたいがインストール済みのdevDependenciesは残しておきたいというケースは考えにくいため、やはりv7以降の挙動が便利だと思いました。
参考