Angularにでてくる。package-lock.jsomってなんだって思ったのでメモを少しまとめてみた。
package-lock.json
package-lock.json:dependencyのバージョンをlockするためのファイル。npm install の実行時に自動的に作成される。
一般にnpm パッケージは他のチームの開発マシン、テスト環境、本番環境など複数の環境で実行されるため、
すべての環境で全く同じバージョンのdependencyをインストールしたいと思うのは自然である。
(バージョンが同じでなければ「ある環境ではうまく実行でき、あるか環境ではエラーが出る」といったことが起こりうる)
実際のところ、package.jsonだけではこれは実現できない。キャレット ^ ,チルダ ~ を使わなければ大丈夫というわけではない。
常にバージョンの変化が起こっているので、そのたびにnpm install をしていると最新バージョンでinstallされてしまう → dependencyのバージョンが異なる環境ができる 。
これを解決するためにnpm v5以降でpackage-lock.jsonが導入された。
このファイルに、dependency、dependencyのdependency…と間接的なものも含めてすべてのdependencyのバージョン(とそのintegrity)が記録される。
npm v6.9.0時点では npm install の具体的な挙動は次のようになっている。
- package-lock.jsonが存在しない
- package.jsonに基づいてdependencyがインストールされ、実際にンストールされたバージョンがpackage-lock.jsonに書かれる。
- package.jsonに基づいてdependencyがインストールされ、実際にンストールされたバージョンがpackage-lock.jsonに書かれる。
- package-lock.jsonが存在するとき
- package-lock.jsonに基づいてインストールされるが、package.json指定されたバージョンとの矛盾があれば、
package.jsonが優先され、実際にインストールされたバージョンがpackage-lock.jsonに書かれる。
- package-lock.jsonに基づいてインストールされるが、package.json指定されたバージョンとの矛盾があれば、
package-lock.jsonを優先したい場合はnpm ci を実行すればよい。
このコマンドはpackage-lock.jsonに基づいてdependencyをインストールし、
もしpackage.jsonとの矛盾があればエラーを出力する。
また、インストール前にnode_modulesを削除するので、クリーンインストールしたいときにも使える。