山pの楽しいお勉強生活

勉強の成果を垂れ流していきます

npm install と npm ci をどのように使い分けるか

※タイトルの npm install は引数なしを想定しています。

一言

  • 引数なしの npm install は使わない
  • 環境構築時には npm ci を使用する

詳細

  • npm install
    • 引数なしの場合、package.json に沿った形で依存ライブラリをインストールする
      • package-lock.jsonは見ない
      • 依存ライブラリの依存ライブラリは最新版がインストールされる
      • 依存ライブラリの指定の範囲での最新版
      • package-lock.jsonを更新する
    • 用途
      • 引数なしは使わない
      • 新規ライブラリの追加、既にpackage.jsonに記載があるライブラリのバージョンアップを行う時
  • npm ci
    • package-lock.jsonに沿った形で依存ライブラリをインストールする
      • 依存ライブラリの依存ライブラリは package-locl.jsonに記載があるバージョンでインストールされる
      • package-lock.json は更新されない
    • 用途
      • そのリポジトリで想定されている環境を作る場合
      • 開発環境、CI環境、本番環境等
    • その他
      • npm install よりもかなり早い
  • 依存ライブラリの更新を定期的に行う場合、CIで npm install をして更新があればpackage-lock.jsonをPRさせるのが良さそう。
  • package.json自体の更新はdependabotを使うと良い。

きっかけ

  • 引数なしの npm install は package-lock.json を更新しないと思っていたが更新された(単純に記憶違い)
  • 各種環境構築スクリプトnpm install が使われていたが、package-lock.json が更新されるため、差分が発生する
  • 社内で聞いたら教えてくれた↑↑の通り教えてくれた

参考URL


追記(2022/05/28)

id:efcl から以下のブコメをもらったので追記。(よくわかっていないのでそのうちもう少し調べる)

npm install と npm ci をどのように使い分けるか - 山pの楽しいお勉強生活

引数なしの`npm install`がpackage-lock.jsonを更新するかは、npmのバージョンで動作が異なる感じ。 <a href="https://github.com/azu/npm-install-update-package-lock/actions/runs/2399517030" target="_blank" rel="noopener nofollow">https://github.com/azu/npm-install-update-package-lock/actions/runs/2399517030</a> <a href="https://github.com/npm/rfcs/issues/415#issuecomment-938279066" target="_blank" rel="noopener nofollow">https://github.com/npm/rfcs/issues/415#issuecomment-938279066</a>

2022/05/28 10:44
b.hatena.ne.jp

  • azuさんのGitHub Actionsの結果を見ると、npm6とnpm8で npm install をした結果、npm6はlockファイル内の依存ライブラリのバージョンが変更されているが、npm8は変わっていなかった。
  • 2つ目のリンクの内容はよくわからない
  • 少し調べたところ、npm7からlockファイルのバージョンが上がり、 npm install を行った際にバージョン2に書き換わるらしいのだが関係ある?