npm install --legacy-peer-deps 究竟做了什么?什么时候推荐/什么是潜在用例?
What does npm install --legacy-peer-deps do exactly? When is it recommended / What's a potential use case?
刚刚 运行 进入这个错误:
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 让安装失败是有原因的。
只是 st运行ge 因为我一直在使用 yarn
直到最近,一切都很好。
我是这样解决这个问题的:
首先,发生了什么: react-hook-mousetrap 正在寻找 react@16.8.0,但没有找到。相反,它正在寻找 @react17.0.1,这是一个较新的版本。出于某种原因,捕鼠器不喜欢这个较新的版本,您会收到通知(这没什么大不了的,但他们认为值得停止您的构建)。
一个解决方案:强行安装mousetrap想要的特定版本的react:
yarn add react@16.8.0
这样做是将您的 React 版本回滚到与捕鼠器兼容的稍旧版本。您不会注意到任何差异,并且在未来的迭代中,希望捕鼠器得到更新,所以它会消失。
另一种解决方案:彻底决定不安装任何旧版本依赖项:
npm add xxxx --legacy-peer-deps
这样做是忽略这个包的旧依赖项。它更全面,并为您做出很多决定。
TL;DR:
如果您从 NPM v6 / Node v12 升级,您可能会得到这个答案。
- NPM v7+ 安装 peerDependencies by default; 不是以前版本的 NPM 的情况。
- NPM 模块必须命名其 peerDependencies
的特定版本
- 如果您已经安装了 peerDependency,但没有安装模块命名的版本,那么 NPM v7+ 将抛出错误
- 添加
--legacy-peer-deps
会忽略这一新要求,存在引入重大更改的风险
--legacy-peer-deps 从 NPM v4 到 v6 恢复 peerDependency 安装行为
考虑这个标志的一种方式是它没有做新的事情;相反,它告诉 NPM 不 做一些新的事情,因为 NPM v7 现在默认安装 peerDependencies.
在很多情况下,这会导致版本冲突,从而破坏安装过程。
--legacy-peer-deps
标志是在 v7 中引入的,作为绕过 peerDependency 自动安装的一种方式;它告诉 NPM 忽略对等依赖并继续安装。 这就是 NPM v4 到 v6 过去的样子。
如果您不清楚常规 deps 和 peer deps 之间的区别,这里有一些上下文:
依赖与对等依赖
依赖项: NPM 模块需要才能在生产环境中工作的库或模块。 (示例:我最近构建了一个饼图模拟库,它使用 Chance.js 来计算指定范围内的随机数;因此 Chance 是我模块的 dependency。)
peerDependencies:对等依赖是第三方软件库的特定版本或版本集,一个模块被设计用于。它们在概念上类似于浏览器扩展和浏览器之间的关系。 (示例:react-redux 有两个非常合乎逻辑的 peerDependencies:react
和 redux
。)
这个问题部分是由 React v17 驱动的
由于大量模块没有专门添加 React v17 作为 peerDependency,现在在 v17 React 应用程序中 运行ning npm 安装时遇到 unable to resolve dependency tree
错误是很常见的.
只要模块(或其任何依赖项)将以前版本的 React 列为 peerDependency 且未特别包括 React v17,就会触发此错误。
(注意:任何其他框架或库的主要版本更新都会发生类似的行为。)
如何检查任何给定模块的 peerDependencies
NPM 本身不会在给定模块的页面上列出对等依赖项。但是,有一个简单的解决方法可以在安装之前或之后检查对等依赖。只需 运行:
npm info name-of-module peerDependencies
此命令将 return 每个 peerDependency 的名称以及所有兼容版本。
我解决了(用纱线)将以下内容添加到 package.json
"resolutions": {
"**/react": "17.0.2",
"**/react-dom": "17.0.2"
},
如果您不想阻止安装较旧的依赖项,您可以通过强制使用脚本让 npm 忽略这些警告 运行。 --force
刚刚 运行 进入这个错误:
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 让安装失败是有原因的。
只是 st运行ge 因为我一直在使用 yarn
直到最近,一切都很好。
我是这样解决这个问题的:
首先,发生了什么: react-hook-mousetrap 正在寻找 react@16.8.0,但没有找到。相反,它正在寻找 @react17.0.1,这是一个较新的版本。出于某种原因,捕鼠器不喜欢这个较新的版本,您会收到通知(这没什么大不了的,但他们认为值得停止您的构建)。
一个解决方案:强行安装mousetrap想要的特定版本的react:
yarn add react@16.8.0
这样做是将您的 React 版本回滚到与捕鼠器兼容的稍旧版本。您不会注意到任何差异,并且在未来的迭代中,希望捕鼠器得到更新,所以它会消失。
另一种解决方案:彻底决定不安装任何旧版本依赖项:
npm add xxxx --legacy-peer-deps
这样做是忽略这个包的旧依赖项。它更全面,并为您做出很多决定。
TL;DR:
如果您从 NPM v6 / Node v12 升级,您可能会得到这个答案。
- NPM v7+ 安装 peerDependencies by default; 不是以前版本的 NPM 的情况。
- NPM 模块必须命名其 peerDependencies 的特定版本
- 如果您已经安装了 peerDependency,但没有安装模块命名的版本,那么 NPM v7+ 将抛出错误
- 添加
--legacy-peer-deps
会忽略这一新要求,存在引入重大更改的风险
--legacy-peer-deps 从 NPM v4 到 v6 恢复 peerDependency 安装行为
考虑这个标志的一种方式是它没有做新的事情;相反,它告诉 NPM 不 做一些新的事情,因为 NPM v7 现在默认安装 peerDependencies.
在很多情况下,这会导致版本冲突,从而破坏安装过程。
--legacy-peer-deps
标志是在 v7 中引入的,作为绕过 peerDependency 自动安装的一种方式;它告诉 NPM 忽略对等依赖并继续安装。 这就是 NPM v4 到 v6 过去的样子。
如果您不清楚常规 deps 和 peer deps 之间的区别,这里有一些上下文:
依赖与对等依赖
依赖项: NPM 模块需要才能在生产环境中工作的库或模块。 (示例:我最近构建了一个饼图模拟库,它使用 Chance.js 来计算指定范围内的随机数;因此 Chance 是我模块的 dependency。)
peerDependencies:对等依赖是第三方软件库的特定版本或版本集,一个模块被设计用于。它们在概念上类似于浏览器扩展和浏览器之间的关系。 (示例:react-redux 有两个非常合乎逻辑的 peerDependencies:react
和 redux
。)
这个问题部分是由 React v17 驱动的
由于大量模块没有专门添加 React v17 作为 peerDependency,现在在 v17 React 应用程序中 运行ning npm 安装时遇到 unable to resolve dependency tree
错误是很常见的.
只要模块(或其任何依赖项)将以前版本的 React 列为 peerDependency 且未特别包括 React v17,就会触发此错误。
(注意:任何其他框架或库的主要版本更新都会发生类似的行为。)
如何检查任何给定模块的 peerDependencies
NPM 本身不会在给定模块的页面上列出对等依赖项。但是,有一个简单的解决方法可以在安装之前或之后检查对等依赖。只需 运行:
npm info name-of-module peerDependencies
此命令将 return 每个 peerDependency 的名称以及所有兼容版本。
我解决了(用纱线)将以下内容添加到 package.json
"resolutions": {
"**/react": "17.0.2",
"**/react-dom": "17.0.2"
},
如果您不想阻止安装较旧的依赖项,您可以通过强制使用脚本让 npm 忽略这些警告 运行。 --force