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

随着npm5的发布 ,它现在将写一个package-lock.json除非npm-shrinkwrap.json package-lock.json已经存在。

我通过以下途径在全球安装npm5:

 npm install npm@5 -g 

而现在,如果在一个npm-shrinkwrap.json中findnpm-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.jsonreplaceshrinkwrap。 然而,为什么有一个新的格式呢? package-lock.json做什么, npm-shrinkwrap.json package-lock.json做什么?

这些文件具有完全相同的内容,但npm如何处理这些文件存在一些差异,在文档站点上以及在npm repo中的文档文件中进行了描述, 该文档 首先明确地解决了这两个文件之间的区别 :

  • package-lock.json永远不会发布到npm,而npm-shrinkwrap package-lock.json是默认的
  • 不在顶级package-lock.json文件将被忽略,但是属于依赖关系package-lock.json文件受到尊重
  • npm-shrinkwrap.json与npm版本2,3和4是向后兼容的,而package-lock.json只能被npm 5+

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

从而:

  • 如果你没有发布你的包到npm,这两个文件之间的select是没有多大意义的。 你可能希望使用package-lock.json因为它是默认的,它的名字对npm初学者更清晰; 或者,如果您难以确保您的开发团队中的每个人都在npm 5+上,则可能希望使用npm-shrinkwrap.json向后兼容npm 2-4。 (请注意,npm 5于2017年5月25日发布,向后兼容将越来越不重要,因为大多数人最终都会升级。
  • 如果您将软件包发布到npm,您可以select:

    1. 使用package-lock.json准确地logging你安装的依赖关系的版本,但是允许安装你的包的人使用与你的package.json规定的版本范围兼容的任何版本的依赖关系,或者
    2. 使用npm-shrinkwrap.json来保证安装你软件包的每个人都得到完全相同的版本

    文档中描述的(非常简洁的)官方视图是,选项1应该用于库(大概是为了减less大量的包依赖关系都依赖于相同次要依赖关系的稍微不同的版本时引起的包重复的数量) ,但是对于即将在全球范围内安装的可执行文件,选项2可能是合理的。

NPM开发者的解释 :

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

新的lockfile(“package-lock.json”)基本上共享所有相同的代码,与npm-shrinkwrap完全相同的格式(您可以在另一个之间重命名它们)。 社区似乎也明白这一点:“它有一个锁文件”似乎比人们更快地点击。 最后,拥有一个新的文件意味着我们可以使用shrinkwrap来进行相对低风险的逆向压缩,而不必像在父文章中提到的允许发布那样的奇怪的事情。

我认为这个想法是 – 默认情况下保存和缩小,但是避免任何可能的问题发生在不需要的地方。 所以,他们只是给了它一个新的文件名,以避免任何冲突。 来自npm的一个人在这里解释得更彻底:

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

相关报价:

默认情况下,npm会在你的源代码目录中发布大多数文件,而且人们已经发布了多年的shrinkwraps。 我们不想破坏兼容性。 在默认情况下,保存和收缩包装是非常危险的,它意外地通过registry进行传播,基本上使我们能够更新数据库和重复数据删除。

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