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

npm-shrinkwrap.json和package-lock.json之间有什么区别?,npm,npm-shrinkwrap,package-lock.json,Npm,Npm Shrinkwrap,Package Lock.json,使用,它现在将编写一个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.

使用,它现在将编写一个
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
不能做什么?

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

有关引述:

默认情况下,npm发布源目录中的大多数文件,并且 多年来,人们一直在出版收缩包装。我们不想 破坏兼容性。默认情况下,使用--save和shrinkwrap,会出现 一个巨大的风险,它意外地使它在和传播通过 注册表,基本上呈现我们更新DEP和 重复数据消除。。。空

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

:

这个想法肯定是为了让package-lock.json成为最新的 在包覆面提取技术方面是最伟大的,npm-shrinkwrap.json将成为 留给那些珍爱的少数人,他们非常关心 关于他们的库有一个精确的节点和模块——以及对于人们 谁希望CI使用npm@>=2安装特定树而不需要 以升级其npm版本

新的锁文件(“package lock.json”)基本上共享所有 代码相同,格式与npm包覆面提取完全相同(您可以重命名 他们彼此之间的关系!)。这也是社区似乎要做的事情 理解:“它有一个锁文件”似乎用鼠标点击要快得多 人。最后,拥有一个新的文件意味着我们可以 低风险向后兼容收缩膜,无需进行怪异操作 类似于允许在父帖子中提到的发布


这些文件的内容完全相同,但npm处理这些文件的方式存在一些差异,其中大部分都在和的文档页面上注明:

  • 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可能是合理的


我仍然不清楚两者之间的区别。如果
npm shrinkwrap
用于精确的节点\ u模块……我假设
package lock.json
的锁定比精确的少?如果是这样的话,
npm shrinkwrap
正在锁定的不是锁定什么?您在@dman中搞错了。package lock是npm shrinkwrap的新版本。软件包锁定是opt-out(因此您必须删除该功能,因为它是默认启用的),npm shrinkwrap是opt-in(因此您必须启用它,因为它不包括我的默认设置)。他们引入包锁的原因是1。用户现在有了一个省钱的方法来处理依赖项,因为它在默认情况下是启用的,2。该名称暗示了它在oposite中的“收缩包装”。npm shrinkwrap有一些特殊的依赖行为设置,而package lock现在没有这些设置。npm包覆面提取现在已过时。这是不正确的。说package lock是npm shrinkwrap的新版本,就是说它是一个替代品。npm shrinkwrap未被弃用,与package-lock.json存在差异。此外,package-lock.json而npm shrinkwrap不。。。因此强调更多,因此它们不是相同的代码。此外,package-lock.json具有侵入性。因此,如果调用“npm i”,而应显式生成包络处理,则很容易导致scm冲突,并且不会在ci服务器上导致冲突。是的,我可能错了。@dman“p