「npm install」がpackage-lock.jsonを書き換えるのはなぜですか? 質問する

「npm install」がpackage-lock.jsonを書き換えるのはなぜですか? 質問する

最近npm@5にアップグレードしました。現在、 package.jsonのすべてを含むpackage-lock.jsonファイルがあります。これを実行すると、依存関係のバージョンがロック ファイルから取得され、 node_modulesディレクトリに何をインストールする必要があるかが決定されると予想していました。奇妙なのは、実際にはpackage-lock.jsonファイルが変更され、書き換えられることです。npm install

たとえば、ロック ファイルでは、typescript のバージョンが2.1.6に指定されていました。その後、npm installコマンドを実行すると、バージョンが2.4.1に変更されました。これでは、ロック ファイルの目的が完全に失われてしまうようです。

何が足りないのでしょうか? npm にロック ファイルを実際に尊重させるにはどうすればよいですか?

ベストアンサー1

更新3:他の回答でも指摘されているように、このnpm ciコマンドはCIコンテキストで高速かつ再現可能なビルドを実現するための追加の方法としてnpm 5.7.0で導入されました。ドキュメンテーションそしてnpmブログ詳細については。


更新2:ドキュメントを更新して明確にする問題はGitHub の問題 #18103


更新1:以下に説明した動作はnpm 5.4.2で修正されました。現在意図されている動作は、GitHub の問題 #17979


元の回答(5.4.2以前):の動作package-lock.jsonは、5.1.0 よりで議論したように問題 #16866あなたが観察した動作は、明らかに npm バージョン 5.1.0 以降で意図された動作です。

つまり、 内の依存関係に新しいバージョンが見つかるたびに、package.jsonがオーバーライドできるということです。依存関係を効果的に固定したい場合は、プレフィックスなしでバージョンを指定する必要があります。つまり、またはの代わりにと記述する必要があります。その後、とを組み合わせると、再現可能なビルドが生成されます。明確に言うと、だけではルート レベルの依存関係がロックされなくなりました。package-lock.jsonpackage.json1.2.0~1.2.0^1.2.0package.jsonpackage-lock.jsonpackage-lock.json

この設計上の決定が良かったかどうかは議論の余地がありますが、GitHubではこの混乱から生じた議論が続いています。問題 #17979(私から見れば、それは疑問のある決定です。少なくとも、その名前はlockもはや通用しません。)

もう1つ注意点があります。npmjs.orgではなくGitHubから直接パッケージを取得する場合など、不変パッケージをサポートしていないレジストリにも制限があります。パッケージロックのドキュメントさらに詳しい説明については。

おすすめ記事