安装npm包时无法解决依赖树错误

当尝试使用npm i命令安装npm包时,我得到了以下异常:

Enter image description here

我尝试重新安装Node.js包,并使用以下方法将代理设置为关闭:

set HTTP_PROXY=
set HTTPS_PROXY=

问题仍然存在。我哪里做错了?

更新:

执行以下命令时:

npm install --legacy-peer-deps

系统显示如下错误:

Enter image description here

1013174 次浏览

这与HTTP代理无关。

您有依赖冲突 (不正确的和可能的破碎的依赖项),因此尝试使用--force--legacy-peer-deps运行命令。如果它不生效,临时解决方案就是使用早期版本的Node.js(降低Node.js版本),因为它有时会导致这种错误发生。

# EYZ0:

如你所见,它触发了以下错误:

@angular/http@^9.1.4没有找到匹配的版本。

看看# EYZ0页面请注意,该软件包的最新版本是7.2.16,而你要求一个更高的版本(例如,^9.1.4)!因此,请尝试检查项目依赖关系,并根据所提出的错误来解决问题。

在使用npm 7时,经常会出现这种情况,因为对等依赖关系问题在版本7中被视为错误,而在版本6中通常只是警告。通常使用--legacy-peer-depsnpm配合使用。

当这不起作用时,一个选项是降级到npm 6。降级Node.js是没有必要的(但也没有害处)。相关的依赖管理代码在npm中。降级Node.js通常是巧合,因为这样做通常也会降级npm

另一种比降级npm破坏性更小的方法是使用npx来使用npm的以前版本来执行安装命令:npx -p npm@6 npm install

当所有这些都失败时,通常值得尝试删除node_modules目录和package-lock.json,然后再次运行npm install。这将重新生成node_modulespackage-lock.json

问题似乎是gf-kautomata-pipeline-ui使用的是Angular 9,而@angular/http 需要使用的是Angular 7。(@angular/http已弃用并最终被删除,它的所有功能都被移到了@angular/common中。)

看到:# EYZ0

如果你运行的是Angular 9,那么

  1. package.json中删除@angular/http(在Angular 9中你不需要它)

  2. 确保你的package.json中有@angular/common

  3. < p > # EYZ0运行。

如果你运行的是Angular 7,那么打开你的包。检查并确保你所有的Angular包都不高于^7.0.0。你可能还需要删除gf-kautomata-pipeline-ui,或者联系gf-kautomata-pipeline-ui的作者,看看这个库是否与Angular 7兼容。

尝试删除node modulespackage-lock.json文件,并运行命令npm install 或 尝试# EYZ0 < / p >

试试这个命令-

npm install --save --legacy-peer-deps

除了使用--legacy-peer-deps命令行选项外,还可以将其设置为更永久的配置选项:

npm config set legacy-peer-deps true

某些包在更新到npm 7后会出现这种情况。

参数--legacy-peer-deps可以帮助:

npm i --legacy-peer-deps

这里描述legacy-peer-deps

导致npm在构建peerDependencies时完全忽略peerDependencies 包树,如NPM版本3到6

如果某个包因为过于严格而无法安装 碰撞的peerDependencies,它提供了一种前进的方式 解决问题。
…< / p >

你可以默认设置这个选项为true (npm不推荐):

npm config set legacy-peer-deps true

或者只是等待,直到这些软件包更新。

我只是更新了我的Node.js,它为我工作:

node -v

输出:

V xxxx

和:

sudo npm install -g n

(使用此命令安装稳定节点release)

sudo n stable

在我的情况下,我开始得到错误(如下)后,npm从版本6升级到7。

< p > npm犯错!ERR!无法解析依赖项 树< / p >

...

npm犯错!修复上游依赖项冲突,或使用——force或——legacy-peer-deps重试此命令,以接受错误的(可能损坏的)依赖项解决方案。

在我的例子中,使用--legacy-peer-deps--force标记进行编译会导致一个无用的包。

所以我尝试删除node_modulespackage-lock.json和使用yarn install的捆绑包。这将生成一个yarn.lock文件并创建包锁。Json,在后续的NPM运行中工作良好。

附注:我正在使用临时的解决方法,直到npm 7与我的项目工作良好:之后,我将删除yarn.lockpackage-lock.json和文件夹node_modules,并使用npm重新编译

rm -rf node_modules
rm package-lock.json
yarn install
# Generates a yarn.lock file and a new package-lock.json


# Continue with npm
npm start
  1. 如果你的根目录中有node_modules文件夹和package-lock.json文件,那么删除它们:

    rm -r node_modules
    rm package-lock.json
    
  2. 执行以下命令:

    npm install --save --legacy-peer-deps
    npm audit fix --force
    
  3. 在根目录中创建.env文件,并粘贴以下代码:

    SKIP_PREFLIGHT_CHECK=true
    
  4. 现在,开始你的项目:

    npm start
    

最快的解决方案:npm install --legacy-peer-deps

解释:

在npm版本3到6中,peerDependencies不会自动安装,如果在树中发现无效的peer dependency版本,将会发出警告。从npm v7开始,peerDependencies是默认安装

npm docs: peerDependencies

你的依赖包含一些peerDependencies,这些peerDependencies与根项目的依赖冲突。

正如在npm ERR日志中所描述的那样。

重置package-lock.json对我来说很好:

git checkout -- package-lock.json

< em >细节: 在更新遗留项目的所有包时,我经常遇到这种情况——我强烈不建议使用npm audit fixnpm i --force。删除package-lock.json对我来说也并不管用。回滚到package.json + package-lock.json的工作版本并添加包对我来说是最安全和最快的变体

首先我尝试了

npm install

它给了我错误unable to resolve dependency tree,根据这个命令的帮助信息,

Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.

我尝试了这个命令:

npm install --legacy-peer-deps

这解决了我的问题。

在我的例子中,我遇到了@babel /核心依赖项的问题,但我不想使用--force,因为我不确定结果,所以我去了https://www.npmjs.com/,寻找包并用最新的包替换了我的旧版本。这就成功了。

以防万一,当我尝试npm upgrade我现在的Angular 11时,我确实有类似的行为。或者基于Angular 12.x创建新的ng new abc。我只是忘了升级Angular CLI。所以这个npm install -g @angular/cli@latest解决了我在ng new abc期间的错误。

这个问题我已经遇到过很多次了。最后我找到了一个解决方案:

npm install react-native-paper  --legacy-peer-deps

首先要了解问题。以下是我的错误:

npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! While resolving: project-admin@11.0.0
npm ERR! Found: @angular/common@11.0.3
npm ERR! node_modules/@angular/common
npm ERR!   @angular/common@"11.0.3" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer @angular/common@"^9.1.0 || ^10.0.0" from @agm/core@3.0.0-beta.0
npm ERR! node_modules/@agm/core
npm ERR!   @agm/core@"3.0.0-beta.0" from the root project

首先,你应该从下到上读这道题。这里@agm/core@3.0.0-beta.0要求 常见的 9.1.0或10.0.0。上面的消息说找到的 常见的实际上是11.0.3。

(如果你想更好地理解依赖关系,这里有一个非常简单的网站:How npm3 Works)

dependencies — these are the essential dependencies that you rely on and call in your project’s code
devDependencies — these are your development dependencies, for example, a prettier library for formatting code
peerDependencies — if you set a peer dependency in your package.json, you are telling the person who installs your package that they need that dependency with the specified version
optionalDependencies — these dependencies are optional and failing to install them will not break the installation process
bundledDependencies — it’s an array of packages that will come bundled with your package. This is useful when some 3rd party library is not on NPM, or you want to include some of your projects as modules

那么解决方案应该是什么呢?问题在于对等依赖关系。解决方案是降级 常见的 <强>或< / >强,解决方案是使用遗留依赖逻辑,使用——legacy-peer-deps安装包。所以——legacy-peer-deps不会尝试自动安装peerDependencies。这对你有用吗?也许,是的。但是你应该添加具体的说明如何做到这一点,或者使用——legacy-peer-deps自动用于未来的项目包安装,使用前面回答之一的代码:

npm config set legacy-peer-deps true

在我的情况下,我安装了包,并试图运行ng serve,但因为使用了——legacy-peer-deps,所以有依赖包没有安装。我必须手动安装(因为我没有从上面的代码设置配置)。在最后手动安装了大约五个包,都是用——legacy-peer-deps,我结束了一个无法安装的包,我没有尝试继续,因为我的项目像疯了一样抛出警告,还有很多包需要审核。所以我决定不使用这个包,而是寻找一个替代品。

我读到的其他解决方案:

  • 将Node.js降至v14。这将降级npm。它可能不是v14,但这是最广泛降级到的版本。
  • 有些人使用来强制安装包——我个人不明白这是如何工作的,因为我没有使用过Yarn。
  • 将Angular和Angular CLI的全局版本降级为满足需求的版本。在我的例子中是角/常见,在这个问题中是角/核心,但两者都需要降低整个角右(我不确定在这里)。
  • 你安装的包可能有一个更高的版本,不需要降级Angular。您可以尝试使用https://updatepackagejson.com/将包升级到最新版本,但这是在您的项目非常新的情况下。

该问题与依赖冲突或破坏的依赖有关。您可以通过强制安装来接受依赖项的错误。

使用--force命令。

您的命令将类似于npm install --force @your-npm-package

你可以使用yarn来安装一个依赖,如果它在yarn包管理器中安装可用的话。

有一个解决这个问题的特性。如果可以,尝试使用它来安装包。

NPM可以用来安装和管理项目中依赖项的版本。

我在React版本和npm版本上也遇到了同样的问题:

NPM错误发现类型/react@16.14.20

因此它可能是需要基于package.json文件安装的包版本。

它会在npm 7版本中给出错误,并且无法安装Node.js模块。

如果你将降级 npm版本改为6,这些问题将成为警告,问题将得到解决。

  • 尝试证明该命令:NPM install -g npm@6

  • 检查版本是否已经安装:< >强npm——版本< / >强

  • 删除并安装node_modules包

    a)删除Rm -rf node_modules

    b)安装:< >强npm我< / >强

尝试以下两种方法来解决此问题:

  • 选项1:运行后删除node_modules文件夹和package_lock.json文件: # EYZ0 < / p >

  • 选项二:执行npm install --save --legacy-peer-deps

最后,我找到了答案。试试这个命令-

npm install --save --legacy-peer-deps

这里描述legacy-peer-deps

这是Node.js版本的问题。一些最新版本的Node.js可能会显示类似的错误。

https://github.com/nvm-sh/nvm

我使用NVM来管理系统上的Node.js版本,并使用Node.js 12来克服这个错误。

修改版本命令:

nvm use 12

这对我来说很管用:

npm install --save --legacy-peer-deps

只需做两个简单的步骤:

首先,在终端中执行这个命令。

npm config set legacy-peer-deps true

其次,清除缓存:

npm cache clean --force

最后,执行你的命令。这肯定有用。

使用

npm install --legacy-peer-deps

这对我很管用。

在这个案子上,我遇到了问题

无法解析依赖树

在一个Angular 13项目中使用了一些来自Azure DevOps中私有npm提要的包。

为了访问这个存储库,我创建了一个.npmrc文件。正因为如此,npm install命令将搜索我的私有存储库中的所有包,而不再是npm feed中的包。无法解析依赖项树错误发生是因为npm install命令找不到很多托管在npm提要而不是我的私有提要中的包。

我找到了这个关于如何确定包范围的惊人答案

在此基础上,我做了一些修改:

  1. 在我的库Package.json中,更新名称以具有作用域名@mylib

    "name": "@myLib/command-queue",
    
  2. 构建并发布这个包到我的私人提要

  3. 在我的客户端应用程序(使用这个包的应用程序)中,更新.npmrc文件,只对这个范围内的包使用我的私有提要

    @myLib:registry=https://pkgs.dev.azure.com/...
    always-auth=true
    

现在,每当我运行npm安装命令时,如果包的作用域是@myLib,它就会在我的私有提要中查找它,并在所有其他情况下使用npm提要(即@angular/…)

这是我的客户端应用Package.json文件的一个例子:

    "@angular/platform-browser-dynamic": "~13.3.0",
"@angular/router": "~13.3.0",        <-- this comes from npm
"@myLib/jcg-command-queue": "^2.2.0", <-- This comes from my private feed

而且,有了这个改变,就不需要在npm install命令中添加——legacy-peer-deps了。

把Node.js降级到v14适合我。

使用这些命令:

source ~/.bash_profile
nvm use v14.16.1
npm install

如果它可以帮助某人,我得到这个错误,在GitHub操作,同时推送我更新的包和包锁JSON文件,

问题出在我们内部的NPM包不一致。 我必须添加

legacy-peer-deps=true

在我们的

.npmrc

文件来覆盖依赖项。

所以我觉得有时候最好使用legacy-peer-deps来覆盖项目包中不需要的依赖项

您可以使用显示此错误的两种方式安装包

ERESOLVE unable to resolve dependency tree
  1. 使用npm install--legacy-peer-deps安装包
npm install --save --legacy-peer-deps
  1. 这是两个命令的组合

    a.在npm config中设置legacy-peer-deps为true

    npm config set legacy-peer-deps true
    

    b.现在使用npm install安装包

    npm install
    

免责声明:这假设你使用的是npm v7

注意:如果你遵循兄弟评论的指示,它将创建一个用户范围的配置不会在队友/机器/构建机器人之间同步。

基于项目的遗留对等依赖

你可能会想要legacy-peer-deps 与你的项目相关,这样它就可以在机器/开发人员之间扩散,而不会影响到你的其他项目。

npm config set legacy-peer-deps true --location project

这将创建一个本地文件.npmrc,你可以提交到你的存储库:

legacy-peer-deps=true

然后,你就可以跑了:

npm install

然后提交更新后的锁文件。

记住,# EYZ0:

  • 项目的配置 (/path/to/my/project/.npmrc查看更多):

    npm config set legacy-peer-deps true --location project
    
  • 每个用户配置(默认为$HOME/.npmrc查看更多)

    npm config set legacy-peer-deps true --location user
    

    或者,默认位置是user anyway:

    npm config set legacy-peer-deps true
    
  • 全局配置(默认为$PREFIX/etc/npmrc查看更多)

    npm config set legacy-peer-deps true --location global
    

    或者,--global推断出--location global

    npm config set legacy-peer-deps true --global
    

对于某些项目,修复依赖关系可能不是简单的

在我的案例中,我们有一个遗留版本的关键依赖项想要引入webpack v3(!) -但这是该项目的构建依赖项。

短期内最好的解决方案是使用legacy-peer-deps作为持有。

如果你在紧要关头,你也可以考虑对依赖项进行分叉,并相应地调整它的对等依赖项——它们将你的项目指向分叉。