package-lock.json の役割は何ですか? 質問する

package-lock.json の役割は何ですか? 質問する

npm@5 が公開されましたが、新しい機能package-lock.jsonファイル ( 以降npm install) があり、混乱しています。このファイルの効果は何なのか知りたいです。

ベストアンサー1

それ自体のようなスター付きバージョン管理 (例: 1.0.*) を使用するのではなく、正確なバージョン管理された依存関係ツリーを保存しますpackage.json。つまり、他の開発者や製品リリースなどに対する依存関係を保証できます。ツリーをロックするメカニズムも備えています (これが名前の由来ですpackage-lock) が、通常は変更があった場合は再生成されますpackage.json

からnpmドキュメント:

package-lock.json は、npm が node_modules ツリーまたは package.json のいずれかを変更する操作に対して自動的に生成されます。生成されたツリーを正確に記述するため、中間依存関係の更新に関係なく、後続のインストールで同一のツリーを生成できます。

このファイルはソース リポジトリにコミットされることを目的としており、さまざまな目的に使用されます。

チームメイト、デプロイメント、継続的インテグレーションでまったく同じ依存関係がインストールされることが保証されるような依存関係ツリーの単一の表現を記述します。

ディレクトリ自体をコミットしなくても、ユーザーが node_modules の以前の状態に「タイムトラベル」できる機能を提供します。

読み取り可能なソース管理の差分を通じてツリーの変更の可視性を高めます。

また、npm が以前にインストールされたパッケージのメタデータ解決を繰り返しスキップできるようにすることで、インストール プロセスを最適化します。」


正確なバージョン番号でを使用するという、以下の jrahhali の質問に回答しますpackage.json。 にはpackage.json直接の依存関係のみが含まれており、依存関係の依存関係 (ネストされた依存関係または推移的な依存関係と呼ばれることもあります) は含まれていないことに注意してください。つまり、標準ではpackage.json、ネストされた依存関係のバージョンを制御できず、直接の依存関係がこれらのネストされた依存関係に対して定義するバージョン許容範囲も制御できないため、それらを直接参照したり、ピア依存関係として参照したりしても役に立ちません。

直接の依存関係のバージョンをロックダウンしたとしても、依存関係ツリー全体が常に同一であることを100%保証することはできません。次に、非破壊的な変更(セマンティックバージョニング) を使用すると、ネストされた依存関係の制御がさらに少なくなり、直接の依存関係がセマンティック バージョン管理ルール自体に違反しないことを保証できなくなります。

これらすべての解決策は、package-lock.json上記のように完全な依存関係ツリーのバージョンをロックする ファイルです。これにより、他の開発者やリリースに対して依存関係ツリーを保証しながら、標準を使用して新しい依存関係バージョン (直接または間接) をテストすることができますpackage.json

注: 前回のnpm-shrinkwrap.jsonほぼ同じことを行いますが、ロック ファイルの名前が変更され、機能が明確になります。プロジェクトに既にシュリンク ラップ ファイルがある場合は、ロック ファイルの代わりにこれが使用されます。


2023

NPM v8.3.0 (2021-12-09) 以降では、ファイルに触れないようにするのに役立つpackage.jsonプロパティがあります。overridespackage-lock.json

依存関係がどのバージョンに依存しているかに関係なく、パッケージ foo が常にバージョン 1.0.0 としてインストールされるようにするには、次のようにします。

{
  "overrides": {
    "foo": "1.0.0"
  }
}

https://docs.npmjs.com/cli/v9/configuring-npm/package-json#overrides

おすすめ記事