如何解决npm install --legacy-peer-deps 究竟做了什么?什么时候推荐/什么是潜在用例? 依赖与对等依赖
刚遇到这个错误:
npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! While resolving: nexttwin@0.1.0
npm ERR! Found: react@17.0.1
npm ERR! node_modules/react
npm ERR! react@"17.0.1" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer react@"^16.8.0" from react-hook-mousetrap@2.0.4
npm ERR! node_modules/react-hook-mousetrap
npm ERR! react-hook-mousetrap@"*" from the root project
npm ERR!
我尝试安装的模块似乎与我安装的模块具有不同的对等依赖项。似乎 npm 在这方面改变了它的行为,现在让安装失败。
我现在可以做些什么来解决这个问题?我不想为此降级我的 React 版本。
我知道有一个名为 --legacy-peer-deps
的标志,但我不确定它到底有什么作用以及是否建议使用它/潜在的缺点是什么?我认为 npm 确实让安装失败是有原因的。
这很奇怪,因为直到最近我还在使用 yarn
,一切都很好。
解决方法
--legacy-peer-deps 从 NPM v4 到 v6 恢复 peerDependency 安装行为
对这个标志的一种思考方式是它没有做新的事情;而是告诉 NPM 不要做一些新的事情,因为 NPM v7 现在默认安装 peerDependencies。
在很多情况下,这会导致版本冲突,从而中断安装过程。
--legacy-peer-deps
标志是在 v7 中引入的,作为绕过 peerDependency 自动安装的一种方式;它告诉 NPM 忽略对等节点并继续安装。 这就是过去 NPM v4 到 v6 的情况。
如果您不清楚常规 deps 和对等 deps 之间的区别,这里有一些上下文:
依赖与对等依赖
依赖项:NPM 模块需要在生产中工作的库或模块。 (例如:我最近构建了一个饼图模拟库,它使用 Chance.js 计算指定范围内的随机数;因此 Chance 是我的模块的依赖项。)
peerDependencies:对等依赖项是第三方软件库的特定版本或版本集,模块旨在与之配合 em>。它们在概念上类似于浏览器扩展和浏览器之间的关系。 (例如:react-redux 有两个非常合乎逻辑的 peerDependencies:react
和 redux
。)
这个问题部分是由 React v17 驱动的
由于大量模块没有专门添加 React v17 作为 peerDependency,现在在 v17 React 应用程序中运行 npm installs 时遇到 unable to resolve dependency tree
错误是司空见惯的。
每当一个模块(或其任何自己的依赖项)将先前版本的 React 列为 peerDependency 时,该错误就会触发,而特别包括 React v17。
(注意:任何其他框架或库的主要版本更新都会发生类似的行为。)
如何检查任何给定模块的 peerDependencies
NPM 本身不会在给定模块的页面上列出对等节点。但是,有一个简单的解决方法可以在安装之前或之后检查对等节点。只需运行:
npm info name-of-module peerDependencies
此命令将返回每个 peerDependency 的名称以及所有兼容版本。
tl;博士:
- NPM v7 现在默认安装 peerDependencies; v4-v6 不是这种情况
- peerDependency 是一个第三方 npm 模块,给定的模块设计用于使用
- NPM 模块必须命名其对等依赖项的特定版本
- 例如,如果您正在运行一个 React v17 应用程序并且一个模块没有将 React 17 列为 peerDependency -- 但已经列出了旧版本 -- 它会导致安装失败
- 将
--legacy-peer-deps
添加到您的 npm 安装将绕过 peerDependency 自动安装,但这可能会由于潜在的破坏性更改而导致冲突
我是这样解决这个问题的:
首先,发生了什么: react-hook-mousetrap 正在寻找 react@16.8.0,但没有找到。相反,它正在寻找@react17.0.1,这是一个较新的版本。出于某种原因,捕鼠器不喜欢这个新版本,您会收到通知(这没什么大不了,但他们认为值得停止您的构建)。
一种解决方案:强行安装捕鼠器想要的特定版本的react:
yarn install react@16.8.0
这样做是将您的反应版本回滚到与捕鼠器兼容的稍旧版本。您不会注意到任何差异,并且在未来的迭代中,希望捕鼠器得到更新,因此这种情况会消失。
另一种解决方案:彻底决定不安装任何旧版本的依赖项:
npm install xxxx --legacy-peer-deps
这样做是忽略此包的旧依赖项。它更全面,并为您做出很多决定。
,dtabuenc 是正确的。默认情况下,NPM v7 开始安装对等依赖项,您需要 --legacy-peer-deps 标志来防止这种默认行为。
,我解决了(用纱线)将以下内容添加到 package.json
"resolutions": {
"**/react": "17.0.2","**/react-dom": "17.0.2"
},
,
如果您不想阻止安装较旧的依赖项,您可以通过强制您正在运行的脚本使 npm 忽略这些警告。 --force
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。