npm-shrinkwrap.json和package-lock.json有什么区别?

k0p*_*kus 131 npm npm-shrinkwrap package-lock.json

随着npm @ 5发布,package-lock.json除非npm-shrinkwrap.json已经存在,否则它现在将写入.

我在全球范围内安装了npm @ 5:

npm install npm@5 -g
Run Code Online (Sandbox Code Playgroud)

现在,如果npm-shrinkwrap.json在以下期间找到a :

npm install
Run Code Online (Sandbox Code Playgroud)

将打印一条警告:

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!
Run Code Online (Sandbox Code Playgroud)

所以我的外卖是我应该用the替换收缩膜package-lock.json.

然而,为什么会有新的格式呢?那可以package-lock.json做什么npm-shrinkwrap.json不可以?

Mar*_*ery 148

这些文件具有完全相同的内容,但在npm如何处理它们方面存在一些差异,在docs网站上以及npm repo的docs文件中描述,首先明确解决这两个文件之间的差异:

  • package-lock.json从未发布到npm,而npm-shrinkwrap默认情况下
  • package-lock.json 将忽略不在顶级程序包中的文件,但会遵循属于依赖项的shrinkwrap文件
  • npm-shrinkwrap.json向后兼容npm版本2,3和4,而package-lock.json只有npm 5+才能识别

您可以通过运行将现有转换package-lock.json为a .npm-shrinkwrap.jsonnpm shrinkwrap

从而:

  • 如果您没有将软件包发布到npm,那么这两个文件之间的选择就不那么重要了.您可能希望使用,package-lock.json因为它是默认设置,其名称对于npm初学者来说更清晰; 或者,npm-shrinkwrap.json如果您难以确保开发团队中的每个人都在npm 5+以上,那么您可能希望使用向后兼容性与2-4.(请注意,npm 5于2017年5月25日发布;由于大多数人最终会升级,因此从该日期开始,向后兼容性将变得越来越不重要.)
  • 如果您发布你的包NPM,您有以下两种选择:

    1. 使用a package-lock.json来准确记录您安装的依赖项的版本,但允许安装程序包的人使用与您指定的版本范围兼容的任何版本的依赖项package.json,或者
    2. 使用an npm-shrinkwrap.json来保证安装程序包的每个人都获得完全相同的所有依赖项版本


    文档(非常简洁地)描述的官方视图是选项1应该用于库(可能是为了减少当许多包的依赖关系都依赖于相同辅助依赖的略微不同版本时导致的包复制量)但是,对于将要全局安装的可执行文件,该选项2可能是合理的.

  • +1 - 你能澄清你的第二个要点吗?这种行为和使用 npm-shrinkwrap 有什么区别? (2认同)
  • @Rhys 第二颗子弹在实践中无关紧要,除非你在做一些奇怪的事情。基本上,它只是说,如果某个库以某种方式 * 确实 * 发布了一个 `package-lock.json`(这是不可能的),那么如果您将该库安装为某个其他包的依赖项,则该库的 `package -lock.json` 将被 NPM 忽略。但是,如果一个库发布了一个 `npm-shrinkwrap.json`,并且您将该库安装为依赖项,那么您将*还*安装库的 `npm-shrinkwrap 中指定的所有依赖项的 *确切版本* 作为辅助依赖项.json`。 (2认同)

Ser*_*usM 27

NPM开发者的解释:

这个想法绝对是package-lock.json成为最新和最伟大的shrinkwrap技术,npm-shrinkwrap.json将保留给那些非常关心他们的库具有精确node_modules的少数人 - 和对于想要使用npm @> = 2的CI来安装特定树而不必碰撞其npm版本的人.

新的lockfile("package-lock.json")基本上共享所有相同的代码,格式与npm-shrinkwrap完全相同(您可以在彼此之间重命名!).这也是社区似乎理解的东西:"它有一个锁定文件"似乎与人们点击这么快.最后,拥有一个新文件意味着我们可以使用shrinkwrap进行相对低风险的向后兼容,而不必像父帖子中提到的那样做一些奇怪的事情.

  • 我仍然不清楚这种差异.如果`npm-shrinkwrap`是针对确切的node_modules ....我假设`package-lock.json`锁定不完全?如果是这样,什么不锁定`npm-shrinkwrap`锁定? (17认同)
  • 这是不正确的.通过说package-lock是npm-shrinkwrap的新版本,你说它是一个替代品.npm-shrinkwrap不被弃用,与package-lock.json存在差异.此外,package-lock.json [有一个bug](https://github.com/npm/npm/issues/17091),而npm-shrinkwrap不...因此强调更多,所以它们不是相同的代码. (9认同)

Cod*_*eld 12

我认为这个想法是默认情况下会发生--save和shrinkwrap,但是避免在不需要的情况下发生收缩包装的任何潜在问题.所以,他们只是给它一个新的文件名,以避免任何冲突.来自npm的人在这里解释得更彻底:

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

相关报价:

npm默认发布源目录中的大多数文件,人们多年来一直在发布shrinkwraps.我们不想破坏兼容性.默认情况下使用--save和shrinkwrap,它有很大的风险,它意外地进入并通过注册表传播,基本上使我们能够更新deps和重复数据删除... null.

所以我们选择了一个新名字.我们突然选择了一个新名字.新的lockfile基本上共享所有相同的代码,完全相同的格式


Lep*_*nzo 7

package-lock.json仅使用 only 来保证版本npm ci因为如果与 发生冲突,则会npm install覆盖package-lock.jsonpackage.json)。

npm-shrinkwrap.jsonnpm ci和都保证版本npm install