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 锁文件不能正确处理传递依赖的主要内容,如果未能解决你的问题,请参考以下文章