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

Posted

技术标签:

【中文标题】npm-shrinkwrap.json 和 package-lock.json 有啥区别?【英文标题】:What is the difference between npm-shrinkwrap.json and package-lock.json?npm-shrinkwrap.json 和 package-lock.json 有什么区别? 【发布时间】:2017-10-30 16:36:46 【问题描述】:

使用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 不能?

【问题讨论】:

【参考方案1】:

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

package-lock.json 永远不会发布到 npm,而 npm-shrinkwrap 默认情况下是 package-lock.json 不在***包中的文件将被忽略,但属于依赖项的收缩包装文件会受到尊重 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,您可以选择:

    使用package-lock.json 准确记录您安装了哪些版本的依赖项,但允许安装您的软件包的人使用与package.json 指定的版本范围兼容的任何版本的依赖项,或者 使用npm-shrinkwrap.json 保证安装您的包的​​每个人完全获得所有依赖项的相同版本

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

【讨论】:

+1 - 你能澄清你的第二个要点吗?这种行为和使用 npm-shrinkwrap 有什么区别? @Rhys 第二个项目符号在实践中并不重要,除非你在做一些奇怪的事情。基本上,它只是说如果一个库以某种方式确实 发布了package-lock.json(这是不可能的),那么如果您将该库安装为某个其他包的依赖项,则该库的 @ NPM 将忽略 987654338@。但是,如果一个库发布了npm-shrinkwrap.json,并且您将该库安装为依赖项,那么您将中指定的所有依赖项的确切版本安装为辅助依赖项图书馆的npm-shrinkwrap.json 您能否添加npm ci 存在以确保package-lock.json 安装为只读。 (npm install 改变了 package-lock.json 导致混乱和潜在的错误,并且没有利用 package-lock.json 本身。) @k0pernikus 我认为npm ci 处理npm-shrinkwrap.jsonpackage-lock.json 的方式之间没有任何区别 - 它与这个关于两个文件之间区别的问题有什么关系?另外,在阅读之后:我认为 "npm install ... 没有利用 package-lock.json" 自 npm 5.4 以来一直是错误的 - 我相信 npm install 现在尊重您的 @987654352 @除非它与您的package.json 完全不兼容,在这种情况下,后者将优先。 (但我已经离开 javascript 世界一段时间了——我错过了什么吗?) 标记如何防止 npm 发布收缩包装?您提到默认情况下确实如此,这就是我所经历的。而且我不希望在“npm publish”步骤中包含收缩包装。谢谢【参考方案2】:

Explanation from NPM Developer:

这个想法肯定是 package-lock.json 是最新的和 最伟大的收缩包装技术,npm-shrinkwrap.json 是 留给那些非常关心的少数人 关于他们的图书馆有一个确切的 node_modules - 和人们 谁希望 CI 使用 npm@>=2 来安装特定的树而无需 提升它的 npm 版本。

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

【讨论】:

我仍然不清楚区别。如果npm-shrinkwrap 用于精确的node_modules ....我假设package-lock.json 的锁定不精确?如果是这样,npm-shrinkwrap 正在锁定的是什么没有锁定? 你错了@dman。 package-lock 是 npm-shrinkwrap 的新版本。 package-lock 是可选的(因此您必须删除该功能,因为它是默认启用的),npm-shrinkwrap 是可选的(因此您必须启用它,因为它不包括我的默认设置)。他们引入 package-lock 的原因是 1. 用户现在有一种处理依赖项的保护方法,因为它在默认情况下已启用; 2. 名称暗示它与“shrinkwrap”相对。 npm-shrinkwrap 有一些 package-lock 现在没有的特殊依赖行为设置。 npm-shrinkwrap 现在已经过时了。 这是不正确的。通过说 package-lock 是 npm-shrinkwrap 的新版本,你是说它是一个替代品。 npm-shrinkwrap 没有被弃用,并且与 package-lock.json 有所不同。此外,package-lock.json has a bug 而 npm-shrinkwrap 没有...因此强调更多,因此它们不是相同的代码。 package-lock.json 也是侵入性的。所以如果你调用“npm i”很容易导致scm冲突,而shrinkwrap应该显式生成并且不会在ci服务器上引起冲突。是的,我在这里可能是错的。 @dman "package-lock.json 有一个错误,而 npm-shrinkwrap 没有" - 不,它没有。在您链接到的问题中没有任何迹象;它甚至没有提到npm-shrinkwrap。正如我在回答中所指出的,将package-lock.json 转换为npm-shrinkwrap.json 实际上只是通过重命名文件来完成的;它们“相同的代码”。【参考方案3】:

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

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

相关引述:

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

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

【讨论】:

【参考方案4】:

package-lock.json 版本保证只有npm ci (since npm install overwrites package-lock.json if there is a conflict with package.json)。

npm-shrinkwrap.json 版本同时保证npm cinpm install

【讨论】:

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

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

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

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

pac代理和http代理区别

npm run gulp primordials 未定义

用privoxy来pac