Node.js のプロジェクトを触っていると、ほぼ無意識に叩いているコマンドがあります。
npm install
一方で、CI や README には次のコマンドも書かれています。
npm ci
「どちらも依存関係を入れるコマンドでしょ?」くらいの理解で使っている人も多いと思います。私自身も最初はそうでした。
ただ、Node.js の管理や CI 運用を整理する中で、この2つは用途がまったく違うコマンドだと分かってきました。
結論:役割が違う
同じ「インストール」に見えますが、目的がまったく異なります。
- npm install:依存関係を「調整・更新」するためのコマンド
- npm ci:依存関係を「完全に再現」するためのコマンド
npm install は「開発用」
npm install は、開発中に依存関係を変更するためのコマンドです。主な特徴は以下のとおりです。
package.jsonをもとに依存関係を解決するpackage-lock.jsonがあれば参考にする- 必要に応じて lockfile を更新する
- 既存の
node_modulesを使い回す
依存関係を追加・更新するためのコマンド
npm install は lockfile を尊重しますが、package.json と package-lock.json の内容が一致していない場合は lockfile を更新して整合を取ります。たとえば package.json の依存バージョンだけを変更して実行すると、解決された依存関係が package-lock.json に反映されます。
npm ci は「再現用」
一方、npm ci は環境を再現するためのコマンドです。
package-lock.jsonが必須package.jsonと lockfile がズレていたら即エラーnode_modulesを一度削除してから入れ直す- lockfile は一切変更しない
package.json と package-lock.json が一致していない状態では、npm ci はエラーで停止します。実務では、依存関係を変更したときだけ npm install で lockfile を更新し、通常作業や CI では npm ci を使うよう役割分担しておくと混乱を防げます。
まとめ
npm install:依存関係を変更するためのコマンドnpm ci:環境を正確に再現するためのコマンド
実務では、次のルールだけ覚えておけば十分です。
変更するときだけ install、それ以外は ci