npm-shrinkwrap.jsonとpackage-lock.jsonの違いは何ですか?


158

では5 @ NPMのリリースで、それが今で書きますpackage-lock.jsonしない限り、npm-shrinkwrap.jsonすでに存在しています。

私はnpm @ 5をグローバルにインストールしました:

npm install npm@5 -g

そして今、a npm-shrinkwrap.jsonが次の間に見つかった場合:

npm install

警告が表示されます:

npm WARN read-shrinkwrap This version of npm
is compatible with lockfileVersion@1,
but npm-shrinkwrap.json was generated for lockfileVersion@0.
I'll try to do my best with it!

したがって、私の持ち帰りは、シュリンクラップをに置き換える必要があるということpackage-lock.jsonです。

しかし、なぜそれのための新しいフォーマットがあるのですか?何をすることができますpackage-lock.jsonことを行うnpm-shrinkwrap.jsonことができないのですか?

回答:


176

ファイルの内容はまったく同じですが、ドキュメントサイトで説明されいるnpmリポジトリのドキュメントファイルでも説明されているように、npmによるファイルの処理方法にはいくつかの違いがあります

  • package-lock.json npmに公開されることはありませんが、 npm-shrinkwrapが、デフォルトでは
  • package-lock.json トップレベルのパッケージにないファイルは無視されますが、依存関係に属するシュリンクラップファイルは尊重されます
  • npm-shrinkwrap.jsonnpmバージョン2、3、4との下位互換性がありますがpackage-lock.json、npm 5+でのみ認識されます

を実行package-lock.jsonして、既存のものをに変換できnpm-shrinkwrap.jsonます。npm shrinkwrap

したがって:

  • パッケージをnpmに公開しない場合、これら2つのファイルのどちらを選択してもほとんど意味がありません。package-lock.jsonこれはデフォルトであり、その名前はnpm初心者にはわかりやすいので、使用することをお勧めします。あるいは、npm-shrinkwrap.json開発チームの全員がnpm 5+にいることを確認するのが難しい場合は、npm 2-4との下位互換性のために使用することもできます。(npm 5は2017年5月25日にリリースされました。後方互換性は、ほとんどの人が最終的にアップグレードするため、その日付から離れるほど重要性が低くなることに注意してください。)
  • あなたがいる場合している NPMにあなたのパッケージを公開、あなたは間の選択肢があります。

    1. package-lock.jsonインストールした依存関係のバージョンを正確に記録するためにa を使用しますが、パッケージをインストールする人々は、package.json
    2. を使用しnpm-shrinkwrap.jsonて、パッケージをインストールするすべての人がすべての依存関係のバージョンがまったく同じになることを保証します


    ドキュメントで(非常に簡潔に)説明されている公式の見解は、オプション1をライブラリに使用する必要があるということです(おそらく、パッケージの依存関係の多くが同じセカンダリ依存関係のわずかに異なるバージョンに依存している場合に発生するパッケージの重複の量を減らすためです)。ただし、そのオプション2は、グローバルにインストールされる実行可能ファイルには妥当な場合があります。


2
+1-2番目の箇条書きを明確にできますか?その動作とnpm-shrinkwrapの違いは何ですか?
Rhys

2
@Rhys奇妙なことをしているのでない限り、2番目の弾丸は実際には問題になりません。基本的には、それだけでライブラリが何とか場合と言っていましたパブリッシュpackage-lock.json(不可能な)をあなたには、いくつかの他のパッケージの依存関係として、そのライブラリをインストールした場合、その後、ライブラリのは、package-lock.jsonNPMによって無視されるだろう。しかし、図書館が発行した場合npm-shrinkwrap.json、あなたは、あなたがなり、依存関係としてライブラリをインストール二次依存関係としてインストールし、正確なバージョンのライブラリの中で指定されたすべての依存関係のnpm-shrinkwrap.json
Mark Amery 2017

npm ciのインストールをpackage-lock.json読み取り専用として保証するために存在するものを追加してください。(npm install変異しpackage-lock.json混乱や潜在的なバグの原因との利点を取ることはありませんpackage-lock.json自体。)
k0pernikus

@ k0pernikus npm ci処理方法npm-shrinkwrap.jsonとの違いはないと思います-2 package-lock.jsonつのファイルの違いに関するこの質問との関連性は何ですか?また、周りを読んだ後:npm install...は活用されていませんpackage-lock.jsonはnpm 5.4以降は間違っていたと思います-と完全に互換性がない場合を除いnpm install、あなたを尊重します。後者の場合、後者が優先されます。(しかし、私はJavaScriptの世界から少し離れています-何か不足していますか?)package-lock package.json
Mark Amery

27

NPM開発者からの説明

アイデアは、package-lock.jsonがシュリンクラップテクノロジーの最新かつ最高のものになること、そしてnpm-shrinkwrap.jsonが、正確なnode_modulesを備えたライブラリに非常に関心がある貴重な少数の人々のために予約されることです。 npm @> = 2を使用してCIで特定のツリーをインストールし、そのnpmバージョンをバンプする必要がない場合。

新しいロックファイル( "package-lock.json")は、基本的に同じコードをすべて共有し、npm-shrinkwrapとまったく同じ形式です(相互に名前を変更できます!)。それはコミュニティが理解しているようでもあります:「ロックファイルがあります」は人々と非常に速くクリックするようです。最後に、新しいファイルがあることで、親投稿で説明されているallow-publicationなどの奇妙なことをしなくても、shrinkwrapを使用して比較的低リスクの後方互換性を確保できました。


18
私はまだ違いがはっきりしていません。npm-shrinkwrap正確なnode_modules ....の場合は、package-lock.jsonロックが正確ではないと思いますか?そして、もしそうなら、それはロックしてnpm-shrinkwrapいるロックではないものは何ですか?
dman 2017

@dmanを間違えた。package-lockは、npm-shrinkwrapの新しいバージョンです。package-lockはオプトアウト(デフォルトで有効になっているため、機能を削除する必要があります)、npm-shrinkwrapはオプトインです(私のデフォルトに含まれていないため、有効にする必要があります)。彼らがpackage-lockを導入した理由は、1。デフォルトで有効になっているため、依存関係を処理するための節約方法がユーザーにあること、2。名前は、それが「シュリンクラップ」とは反対のものを意味することです。npm-shrinkwrapには、package-lockにはない特別な依存関係動作設定がありました。npm-shrinkwrapは廃止されました。
SeriousM 2017

10
これは誤りです。package-lockがnpm-shrinkwrapの新しいバージョンであると言うことは、それが置き換えであるということです。npm-shrinkwrapは非推奨ではなく、package-lock.jsonとの違いがあります。さらに、package-lock.json にはバグがありますが、 npm-shrinkwrapにはありません。したがって、同じコードではないことを強調します。
dman 2017

また、package-lock.jsonは侵入型です。そのため、「npm i」を呼び出すと、scmwrapを明示的に生成する必要があり、ciサーバーで競合が発生しないため、scmの競合が発生しやすくなります。はい、私はここで間違っている可能性があります。
norekhov 2018年

@dman "package-lock.jsonにはバグがありますが、npm-shrinkwrapにはありません" -ありません。リンクした問題にはそれを示すものはありません。それも言及していませんnpm-shrinkwrap。私の回答で述べているように、a package-lock.jsonをに変換することnpm-shrinkwrap.jsonは、文字通り、ファイルの名前を変更することで行われます。それら「同じコード」です。
マークアメリー2018

12

アイデアは--saveとシュリンクラップがデフォルトで発生するようにすることでしたが、不要な場所でシュリンクラップが発生する潜在的な問題を回避しました。したがって、競合を回避するために、新しいファイル名を付けただけです。npmの誰かがここでそれをより完全に説明しました:

https://www.reddit.com/r/javascript/comments/6dgnnq/npm_v500_released_save_by_default_lockfile_better/di3mjuk/

関連する引用:

npmはデフォルトでソースディレクトリにほとんどのファイルを公開し、人々は何年もシュリンクラップを公開しています。互換性を壊したくありませんでした。--saveとshrinkwrapをデフォルトで使用すると、誤ってそれを作成してレジストリを介して伝播するという大きなリスクがあり、基本的にdepとdedupeを更新する機能をレンダリングします... null。

そこで、新しい名前を選びました。そして突然、新しい名前を選びました。新しいロックファイルは基本的にすべて同じコード、まったく同じ形式を共有します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.