初心者に向けての答え
package-lock.json について、とりあえず以下を守ればプロジェクトに迷惑をかけません。
- 直接編集してはいけません
- 基本的に無視していいファイルです
- 削除してはいけません
-
npm installコマンド実行時に変更されることもありますが、そのときに発生する変更は気にしなくて大丈夫です - マージリクエスト(プルリクエスト)する際に package-lock.json に変更があった場合は、その変更も含めて提出します
※ これは package.json についても同じことが言えます。
もうちょっと知りたい人に向けての答え
- package-lock.json は
npm install実行時に新規作成・更新される - package-lock.json には
npm installで実際にインストールしたパッケージ情報が記載されている - package-lock.json を使用してパッケージをインストールする際には
npm ciコマンドを実行する -
npm ciコマンドを実行する主なユースケースとしては CI 実行時やgit clone後の動作確認などで使用する - 上記の用途があるので package-lock.json は Git で管理したほうがいいファイルである
解説
新規作成・更新されるタイミング
package-lock.json は npm install 実行時に作成・更新されるファイルです。
npm install 実行時は以下のような挙動をしています。
- package.json の内容を更新する
- package.json の内容をもとに node_modules のディレクトリにパッケージをインストールする
- node_modules に実際にインストールされたパッケージのバージョン情報が package-lock.json に記述される
package.json との比較
以下のように記述内容に差があります。
- package.json
- インストールすべきパッケージのバージョンの範囲
- その他もろもろ(npm-scripts など)
- package-lock.json
npm installによって実際にインストールしたパッケージのバージョンのみ
package-lock.json を使用する方法
npm install の代わりに npm ci というコマンドを実行すると package-lock.json を元にパッケージをインストールして node_modules を作成してくれます。
# package-lock.json のバージョンで node_modules を作成するとき
$ npm ci
裏を返すと、npm ci というコマンドを実行しなければ package-lock.json は使用されません。
npm install と npm ci の違い
npm ci と npm install の要点をまとめると以下のようなことがあげられます。
-
npm ciはnpm installと同じように全ての依存パッケージをインストールする -
npm installコマンド実行によって package-lock.json を更新することがある -
npm ciコマンド実行によって package-lock.json は更新されない -
npm ciコマンド実行すると node_modules をすべて削除してからパッケージをインストールする
npm ci の使い所
npm ci の使用頻度の高いユースケースとしては CI 実行時があげられます。
理由としては、package-lock.json が勝手に更新されるのを防いだり、package-lock.json を参照することでインストールするバージョンを固定して node_modules の内容を同じにするためです。
同様の理由から、新規参画者が git clone して動作を確認する場合なども npm ci が用いられます。
(※ ただし CI の速度を求めるなら npm ci は実行時間がやや長いため node_modules をキャッシュして npm install を用いることもあるらしいです。ですが、最初からキャッシュする仕組みを作るよりは、実行時間が長くて困るというような問題が発生してから、そのような対応をすればいいと思います。)
よくある使われどころは以下の通りになります。
- CI 実行時
git clone直後の動作確認- 何かのトラブルで node_modules を空にしてやり直すとき
- 過去の状態を復元するとき
Git で管理すべきファイル?
答えは Yes です。
上記のように npm ci コマンドを使用して、パッケージをインストールする用途があるので、package-lock.json は Git で管理すべきファイルになります。
ちなみにインストールするパッケージに何か変更があると、マージリクエスト(プルリクエスト)時に、package-lock.json に大量の差分が出てくるかと思いますが、それが、npm install 時に自動的に更新された変更であれば、基本的に無視して大丈夫です。
まとめ
- package-lock.json は
npm install実行時に新規作成・更新される - package-lock.json には
npm installで実際にインストールしたパッケージ情報が記載されている - package-lock.json を使用してパッケージをインストールする際には
npm ciコマンドを実行する -
npm ciコマンドを実行する主なユースケースとしては CI 実行時やgit clone後の動作確認などで使用する - 上記の用途があるので package-lock.json は Git で管理したほうがいいファイルである