NPM 锁文件不能正确处理传递依赖

Posted

技术标签:

【中文标题】NPM 锁文件不能正确处理传递依赖【英文标题】:NPM lockfiles do not handle transitive dependencies correctly 【发布时间】:2018-02-06 12:58:32 【问题描述】:

在我当前的项目中,我们在package.json 文件中列出了具有确切版本的依赖项(例如babel-core: '6.5.2'

但是在最近的项目构建之后(包括在构建机器上运行npm install更新了一些节点模块并且我们的工件被破坏了。

研究表明,尽管我们拥有package.json 文件中提到的确切版本,但所需的模块可能通过其依赖关系对自身具有依赖关系,并且它们都使用插入符号依赖关系。在我们的例子中,它似乎是

babel-core: '6.5.2' 取决于 babel-register: '^6.16.0' 取决于 babel-core: '^6.9.0' 解析为babel-core: '6.26.0'(因为caret range rules)

而指定的babel-core 版本会破坏我们的构建。

我们已尝试创建 package-lock.json 文件,以防止这些传递依赖项以它们被解析的方式被解析。

但是,正如the documentation 上的package-lock 文件所述:

每当你运行 npm install 时,npm 都会生成或更新你的包锁

因此,所有依赖于 babel-core 的带有插入符号版本的包都使用不正确的模块版本解决。

仔细查看package-lock.json文件后,我认为不值得更改它,因为

    滚雪球效应 - 更改一个依赖项需要更改所有其他依赖项,具体取决于它(这是递归过程)

    需要验证您将要更改为的版本是否存在其哈希值(对于integrity 字段) p>

问题是:如何安装我的package.json 文件中提到的所有模块的确切版本,以防止 NPM 用不同的版本再次解决它?

【问题讨论】:

【参考方案1】:

尝试使用npm shrinkwrap,它用于传递锁。

【讨论】:

我遇到了同样的问题。当一切正常时,收缩包装很好。但是,当您遇到问题时,您就是在“冻结”问题。

以上是关于NPM 锁文件不能正确处理传递依赖的主要内容,如果未能解决你的问题,请参考以下文章

处理传递给程序宏的编译时相关文本文件的正确方法

npm中package.json详解

为啥基于锁的程序不能组成正确的线程安全片段?

如何使用 npm/webpack 正确导入 Gridstack?

如何在 C++ 中正确地在循环中使用互斥锁?

npm 错误!代码 ERESOLVE 无法解析依赖树