-
Notifications
You must be signed in to change notification settings - Fork 4.2k
Description
What and Why
Starting in [email protected], the npm ci command validates that the package-lock.json is consistent with the developer defined package.json. Previously, npm ci would blindly install whatever was in the lock file. We implemented this bugfix for several reasons.
overridesdefined in thepackage.jsoncould be ignored- invalid trees, including unresolvable peer dependencies would be installed
- developer configuration options were ignored
- an attacker could make subtle changes to
package-lock.json
Implementing this fix resolves an entire class of bugs where invalid dependency trees are installed. As a result, a number of CI workflows started producing errors rather than install invalid dependency trees. This has been a controversial fix.
Ways That npm ci Validation Can Fail
- different configuration between
npm installandnpm cilike--legacy-peer-depsor--force - manually edited
package-lock.jsonfiles - edits to the
package.jsonlike changed deps and overrrides without generating a newpackage-lock.jsonwithnpm install - an
npm installbug that produced an incorrect tree or incorrectpackage-lock.jsonin a previous version
Resolving Your Project
In some cases, simply generating a new package-lock.json with npm install will fix the issue, depending the reason the package-lock.json is out of sync with your package.json.
If you're using --legacy-peer-deps with npm install, make sure you also use it with npm ci, perhaps by setting it in your .npmrc.
More complicated cases involve incorrectly resolved peer dependencies. This is common when using React 18, as many packages have semver ranges not including react@18, but still happen to mostly work. This is best resolved through package.json overrides.
Discussions and References
- Most recently npm CLI issue #4998. I made this statement.
- Previous npm CLI issue #4664 in which @nlf makes some clarifying statment.
- This change was implemented in pull request #4666
- Thoughts on bugfixes vs. breaking changes
Next Steps
If you find a bug related to npm ci validation of package-locks.json beyond what is covered above, please file a bug report.
If you would like to suggest changes, please use our RFC process. You can create an RRFC, or participate in discussions on that repo.