npm install と npm ci の違いについて

2020/04/20 05:30

package.json って何?

package.json はそのプロジェクトが使用する、npm パッケージの依存関係などを管理することができる json ファイルのことです。パッケージのバージョン指定には書き方がいくつかあります。  

{
  "hoge": "^10.0.0",
  "huga": "10.0.0",
}

たとえば ^10.0.010.0.0 以上のバージョンのパッケージを指しますが、major.minor.patch のうち、major は更新されません。10.0.010.0.0 そのものです。  

package.json でパッケージバージョンを固定していても、そのパッケージ自体の package.json でパッケージバージョンが固定されているとは限らないようなので、要注意です。  

package-lock.json って何?

npm@5.0.0 以降で、npm install 時に自動生成される json ファイルです。  packeage-lock.json は package.json に記載されたパッケージの、具体的で厳密なリストです。バージョン番号や、そのパッケージの依存リストなどが、正確に記録されています。

npm install と npm ci のちがい

npm install は package.json を元に、依存関係を解決し、パッケージのインストールを行います。その際に、package-lock.json を上書きします。もともとは上書きしない仕様でしたが、パッケージを追加でインストールする際に差が生じて困るので、上書きする仕様になったようです。

npm ci は package-lock.json を元に、パッケージのインストールを行います。依存関係の解決はしませんが、package.json と package-lock.json の間で矛盾が生じていた場合、エラーになります。  インストール前に /node_modules を削除するのでクリーンインストールとしても使えそうです。

結局どっちを使うのがいいんだろう

プロジェクトの clone 直後には npm ci を使うのがいいかもしれないと思いました。package-lock.json に記載されたバージョンのパッケージをインストールしてくれるので、開発メンバーと環境を同じにすることができるからです。これからは npm ci を使うようにしていきたいと思います。