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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了npm-shrinkwrap.json和package-lock.json有什么区别?相关的知识,希望对你有一定的参考价值。

使用release of npm@5,除非已经存在package-lock.json,否则它现在将写入npm-shrinkwrap.json

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

npm install npm@5 -g

现在,如果在以下期间发现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

答案

这些文件具有完全相同的内容,但在npm处理它们的方式上存在一些差异,如the docs sitea docs file in the npm repo that starts by explicitly addressing the difference between these two files所述:

  • 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将现有的npm-shrinkwrap.json转换为npm shrinkwrap

从而:

  • 如果您没有将软件包发布到npm,那么在这两个文件之间进行选择并不重要。您可能希望使用package-lock.json,因为它是默认值,其名称对于npm初学者来说更清晰;或者,如果您难以确保开发团队中的每个人都在npm 5+以上,您可能希望使用npm-shrinkwrap.json向后兼容npm 2-4。 (请注意,npm 5于2017年5月25日发布;由于大多数人最终会升级,因此从该日期开始,向后兼容性将变得越来越不重要。)
  • 如果您要将包发布到npm,您可以选择: 使用package-lock.json准确记录您安装的依赖项的版本,但允许安装程序包的人使用与package.json指定的版本范围兼容的任何版本的依赖项,或者 使用npm-shrinkwrap.json来保证安装程序包的每个人都获得完全相同的所有依赖项版本 文档(非常简洁地)描述的官方视图是选项1应该用于库(可能是为了减少当许多包的依赖关系都依赖于相同辅助依赖关系的略微不同版本时导致的包复制量)但是,对于将要全局安装的可执行文件,该选项2可能是合理的。
另一答案

Explanation from NPM Developer

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

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

另一答案

我认为这个想法是默认情况下会发生--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基本上共享所有相同的代码,完全相同的格式

以上是关于npm-shrinkwrap.json和package-lock.json有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章

sh devDependenciesも含めてNPM-shrinkwrap.jsonを书き出す

yarn.lock 和 npm 的 shrinkwrap 有啥区别?

如何强制排除 NPM 的嵌套依赖项?

npm run gulp primordials 未定义

Python小工具-查看内存和CPU

stream