Skip to content

npm ci validates package-lock.json and could fail to resolve #5113

Closed
@fritzy

Description

What and Why

Starting in npm@8.6.0, 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.

  • overrides defined in the package.json could 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 install and npm ci like --legacy-peer-deps or --force
  • manually edited package-lock.json files
  • edits to the package.json like changed deps and overrrides without generating a new package-lock.json with npm install
  • an npm install bug that produced an incorrect tree or incorrect package-lock.json in 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

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions