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

时间:2017-05-30 09:19:16

标签: 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替换收缩膜。

然而,为什么会出现新的格式呢? package-lock.json不能npm-shrinkwrap.json做什么?

4 个答案:

答案 0 :(得分:127)

这些文件具有完全相同的内容,但在the docs site以及a docs file in the npm repo that starts by explicitly addressing the difference between these two files中描述的npm如何处理它们有一些差异:

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

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

因此:

  • 如果您没有将软件包发布到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保证安装您的软件包的每个人都完全所有依赖项的相同版本

    3. 在文档中描述(非常简洁)的官方视图是应该将选项1用于库(可能是为了减少当许多包的依赖性都依赖于略有不同时导致的包重复的数量相同的二级依赖项的版本,但该选项2对于将要全局安装的可执行文件可能是合理的。

答案 1 :(得分:25)

Explanation from NPM Developer

  

这个想法绝对是package-lock.json是最新的和   最好的收缩包装技术,和npm-shrinkwrap.json   留给那些非常关心的少数人   关于他们的图书馆有一个确切的node_modules - 以及人们   谁想要CI使用npm @> = 2来安装特定的树而没有   碰到它的npm版本。

     

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

答案 2 :(得分:12)

我认为这个想法是默认情况下会发生--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。

     

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

答案 3 :(得分:0)

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 保证。