Reputation: 7483
Just ran into this error:
npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! While resolving: [email protected]
npm ERR! Found: [email protected]
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 [email protected]
npm ERR! node_modules/react-hook-mousetrap
npm ERR! react-hook-mousetrap@"*" from the root project
npm ERR!
The module I am trying to install seems to have a different peer dependency from what I have installed. It seems like npm changed its behaviour in this regard and now lets the install fail.
What can I do now to fix this? I don't want to downgrade my React version for this.
I know there is a flag called --legacy-peer-deps
but I am not sure what exactly this does and whether it's recommended to use it / what the potential disadvantages are? I assume there is a reason npm did let the install fail.
It's just strange because I was using yarn
up until very recently and everything was fine.
Upvotes: 563
Views: 714752
Reputation: 31
I had a dependency error after running the command npm audit fix --force
.
I used this command to fix the error npm add xxxx --legacy-peer-deps
.
Upvotes: 1
Reputation: 7876
--legacy-peer-deps
ignores this new requirement, at the risk of introducing breaking changesOne way of thinking of this flag is that it isn't doing something new; rather it's telling NPM not to do something new, since NPM v7 now installs peerDependencies by default.
In many cases, this is leading to version conflicts, which will break the installation process.
The --legacy-peer-deps
flag was introduced with v7 as a way to bypass peerDependency auto-installation; it tells NPM to ignore peer deps and proceed with the installation anyway. This is how things used to be with NPM v4 thru v6.
If you're unclear about the difference between regular deps and peer deps, here is a bit of context:
Dependencies: Libraries or modules that an NPM module needs in order to work in production. (Example: I recently built a pie chart mocking library that uses Chance.js to calculate random numbers within a specified range; Chance is therefore a dependency of my module.)
peerDependencies: A peer dependency is a specific version or set of versions of a third-party software library that a module is designed to work with. They're similar in concept to the relationship between a browser extension and a browser. (Example: react-redux has two quite logical peerDependencies: react
and redux
.)
Due to the large number of modules that haven't specifically added React v17 (or more recently, React 18) as a peerDependency, it's now commonplace to encounter the unable to resolve dependency tree
error when running npm installs within a v17 React application.
This error will fire whenever a module (or any of its own dependencies) lists a previous major version of React as a peerDependency without specifically including React v17 as well.
(Note: Similar behavior will occur with the major-version update of any other framework or library.)
NPM itself doesn't list peer deps on the pages of a given module. However, there is a simple workaround to check for peer deps, either before or after install. Simply run:
npm info name-of-module peerDependencies
This command will return the name of each peerDependency along with all compatible version(s).
Upvotes: 690
Reputation: 41
--legacy-peer-deps
jumps the installation of all the peer dependencies and gives warnings about the peer deps to notice developers install them manually. When encountering the peer deps conflicts, other than --legacy-peer-deps
, another choice is use --force
.
The official doc of handling peer deps conflicts is this
p.s.
Correct the top answer: --legacy-peer-deps
restores peerDependency installation behavior from NPM v3 thru v6, rather than v4 thru v6.
Upvotes: 4
Reputation: 9787
- Default: false
- Type: Boolean
Causes npm to completely ignore
peerDependencies
when building a package tree, as in npm versions 3 through 6.If a package cannot be installed because of overly strict
peerDependencies
that collide, it provides a way to move forward resolving the situation.This differs from
--omit=peer
, in that--omit=peer
will avoid unpackingpeerDependencies
on disk, but will still design a tree such thatpeerDependencies
could be unpacked in a correct place.Use of
legacy-peer-deps
is not recommended, as it will not enforce thepeerDependencies
contract that meta-dependencies may rely on.
If you want to continue using legacy-peer-deps
without needing to add the flag to every command, you can configure it in your .npmrc
(either at the project level or globally on your machine):
echo "legacy-peer-deps=true" >> .npmrc
npm gets its config settings from the command line, environment variables, and
npmrc
files.The
npm config
command can be used to update and edit the contents of the user and global npmrc files.
Upvotes: 20
Reputation: 2612
Here's how I solved this problem:
First, what's happening: react-hook-mousetrap is looking for [email protected], but it is not finding it. Instead it is finding @react17.0.1, which is a newer version. For some reason mousetrap doesn't like this newer version, and you are being notified (it is not a big deal, but they decided it was worth stopping your build).
One solution: forcibly install the specific version of react that mousetrap wants:
yarn add [email protected]
What this does is roll back your react version to a slightly older one that is compatible with mousetrap. You won't notice any difference, and in future iterations, hopefully mousetrap is updated, so this goes away.
Another solution: make a sweeping decision to not install any older version dependencies:
npm add xxxx --legacy-peer-deps
What this does is ignore old dependencies for this package. It is more comprehensive, and makes a lot of the decisions for you.
Upvotes: 120
Reputation: 49
If you don't want to block installing older dependencies, you can make npm neglect those warnings by forcing the script you're running. --force
Upvotes: 3
Reputation: 559
I resolved (with yarn) adding the following to package.json
"resolutions": {
"**/react": "17.0.2",
"**/react-dom": "17.0.2"
},
Upvotes: 3