HERSHY'SのAdvent Calendar(本物)の4日目を開けたところ。
NPMおれおれAdvent Calendar 2019 – 04日目

先にまとめ

  • 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.json or npm-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 扱いなんですね。

  • preinstall
  • install
  • postinstall

ソース ちらっと見てみたけどなんもわからん。

おしまい

というわけで、CI では npm ci を使うと良さそうです。

package-lock.json については後日また改めて。

参考