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

标签 npm npm-shrinkwrap 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 替换 shrinkwrap。

但为什么要有一种新的格式呢? package-lock.json 可以做什么而 npm-shrinkwrap.json 不能?

最佳答案

这些文件具有完全相同的内容,但 npm 处理它们的方式存在一些差异,其中大部分都在 package-lock.json 的文档页面上注明。和 npm-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 - npm-shrinkwrap.json 和 package-lock.json 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44548732/

相关文章:

npm - 将 npm 的 "package-lock.json"置于版本控制之下有什么意义?

node.js - 为什么 “npm install” 不重写 package-lock.json?如果不存在也不生成新的?

reactjs - 模块 '"<文件路径>/react-redux "' has no exported member ' Dispatch'

node.js - npm 递归更新包

javascript - 如何根据键/值从对象中递归删除属性

node.js - npm shrinkwrap 中的 fsevents(由 chokidar 引入)导致构建在 Windows 上失败

javascript - 插入符范围和 package-lock.json : how to get latest non-breaking versions with them?

angularjs - Visual Studio 2015 没有将 TypeScript 编译为 ASP.NET Core 项目的一部分?

google-chrome-extension - 是否可以在 chrome 扩展中需要 npm 模块?