409
261

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

package-lock.json ってなに?

Last updated at Posted at 2020-10-18

初心者に向けての答え

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 実行時は以下のような挙動をしています。

  1. package.json の内容を更新する
  2. package.json の内容をもとに node_modules のディレクトリにパッケージをインストールする
  3. 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 cinpm install の要点をまとめると以下のようなことがあげられます。

  • npm cinpm 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 で管理したほうがいいファイルである
409
261
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
409
261

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?