npm-shrinkwrap的区别是什么?Json和package-lock.json?

对于发布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不能做的?

75523 次浏览

我认为这个想法是,保存和收缩膜默认发生,但避免任何潜在的问题,收缩膜发生在不需要的地方。所以,他们只是给了它一个新的文件名,以避免任何冲突。来自npm的人在这里更详细地解释了它:

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

相关引用:

默认情况下,npm在源目录中发布大多数文件 人们已经出版收缩包装很多年了。我们不想这么做 打破兼容性。默认的保存和收缩包装,有 有很大的风险,它不小心进入并传播 注册表,并基本上渲染我们的能力更新deps和 dedupe……null。< / p > 所以我们选择了一个新名字。我们选择了一个新名字 突然。新的锁文件基本上共享所有相同的代码 完全相同的格式

来自NPM开发者的解释:

这个想法肯定是为了包锁。json为最新的和 最厉害的收缩膜技术,还有npm-收缩膜。Json 只留给那些非常在乎的少数人 关于他们的库有一个确切的node_modules——和人 谁想要CI使用npm@>=2来安装一个特定的树而没有

新的lockfile ("package-lock.json")基本上共享了所有的lockfile文件 相同的代码,与npm-shrinkwrap完全相同的格式(您可以重命名 他们彼此之间!)。这也是社区似乎在做的事情 理解:“它有一个锁文件”似乎点击得更快 人。最后,有了一个新文件意味着我们可以相对地 低风险的背贴,不用做奇怪的事

这些文件具有完全相同的内容,但是在npm处理它们的方式上有一些不同,其中大部分在package-lock.jsonnpm-shrinkwrap.json的文档页面上都有说明:

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

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

因此:

  • 如果你没有将你的包发布到npm,这两个文件之间的选择影响很小。你可能希望使用package-lock.json,因为它是默认值,它的名字对npm初学者来说更清楚;或者,如果你很难确保你的开发团队中的每个人都使用npm 5+,你可能希望使用npm-shrinkwrap.json来向后兼容npm 2-4。(注意npm 5发布于2017年5月25日;向后兼容性将变得越来越不重要,因为大多数人最终都会升级。)

  • 如果你发布你的包到npm,你有一个选择:

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

    文档中描述的官方观点是选项1应该用于库(大概是为了减少当一个包的大量依赖关系都依赖于同一个次要依赖关系的略有不同的版本时造成的包重复数量),但选项2可能对全局安装的可执行文件是合理的。

只有npm ci (因为如果与__ABC4有冲突,__ABC2会覆盖package-lock.json)才能保证package-lock.json版本。

npm-shrinkwrap.json版本保证使用npm cinpm install