
先にまとめ
npm ciはnpm installと同じように、全依存パッケージをインストールするnpm installはpackage-lock.jsonを更新することがあるnpm ciはpackage-lock.jsonを更新しないnpm ciはnode_modulesを削除してからインストールする
npm ci ってなんだ
npm install に似ているが、CI のような自動化された環境での利用が想定されているもの。あるいは開発環境でクリーンインストールするのにも使える。処理はいくつかの機能を省略するので、npm install より圧倒的に高速な場合がある。
ドキュメントを読むとそんな感じらしい。
基本的には CI で回す場合はこちらを使いましょう、という理解で良さそう。CI ってなに?くらいの段階の方は別に npm install だけでも大きな問題はないはず。
npm install との違い
package-lock.jsonornpm-shrinkwrap.jsonが必須。ないとコケる- それらが
package.jsonの記述と矛盾する場合、コケる - 依存追加には使えない。(
npm install xxxでやる) node_modulesはいったん全消しされるpackage-lock.jsonを更新しない
npm install の問題点
npm install は package-lock.json を更新することがしばしばあります。
理由は package.json に記述する semver が幅のあるバージョンを許すためで、また package-lock.json は(”lock” という名前に反して)node_modules の実際を反映するものだからです。本当にロックしちゃうとそれはそれで問題があったため変更されたようで。マジかよ。
逆に npm ci は package-lock.json を元に node_modules を構築します。
npm ci の使いどころ
- CI で回す場合
git clone直後- 何かがおかしいので
node_modulesを空にしてやり直すとき - 過去の状態を復元するとき
インストールスクリプト
ちょっと仕組みがよくわかんないんだけど、npm ci したら以下のスクリプトは自動で実行されました。npm install 扱いなんですね。
preinstallinstallpostinstall
ソース ちらっと見てみたけどなんもわからん。
おしまい
というわけで、CI では npm ci を使うと良さそうです。
package-lock.json については後日また改めて。