-
Notifications
You must be signed in to change notification settings - Fork 3.8k
Description
Is there an existing issue for this?
- I have searched the existing issues
This issue exists in the latest npm version
- I am using the latest npm
Current Behavior
Consider a package, lib1, with the following characteristics.
- has an
optionalDependency, with an OS constraint, such asfsevents
package.json{ ... "os": [ "darwin" ] ... } - published with a shrinkwrap package descriptor
- shrinkwrap was generated on the platform compatible with the OS-constrained dependency
Developer A creates another package, app1, which depends on lib1, and generates app1's package-lock.json with npm install also on the platform matching said OS constraint.
Developer B, OR a CI process, on a different platform from said OS constraint, runs npm ci to install app1's dependencies. npm ci produces an error like the following.
[.../app1> npm ci
npm error code EBADPLATFORM
npm error notsup Unsupported platform for [email protected]: wanted {"os":"darwin"} (current: {"os":"linux"})
npm error notsup Valid os: darwin
npm error notsup Actual os: linux
npm error A complete log of this run can be found in: /root/.npm/_logs/2024-07-02T12_41_06_204Z-debug-0.log
Examining app1's package-lock.json reveals that npm does not include an "optional": true entry in the package-lock block for lib1's fsevents dependency.
Expected Behavior
npm ci should retain the optional nature of the platform-specific dependency and proceed with a successful clean install of app1's dependencies regardless of the dependencies.
Steps To Reproduce
- On a linux platform, clone the demo repository: https://github.com/restjohn/issues.npm.shrinkwrap_optional_dep.
- Use npm 10.8.1, latest at the time of this writing.
cd app1npm ci- npm should produce an error as in the Current Behavior section above.
Please see the README in the demo repository for quite a bit more detail about the nuances of this behavior.
Also note that the demo repository package lib1.shrinkwrap references the fsevents package through a devDependency, and npm should not be attempting to install lib1.shrinkwrap devDependencies from the app1 package anyway.
Environment
- npm: 10.8.1
- Node.js: 20.15.0
- OS Name: Debian GNU/Linux 12 (bookworm)
- System Model Name: Node 20 Slim Docker image
- npm config:
; node bin location = /usr/local/bin/node
; node version = v20.15.0
; npm local prefix = /npm_transitive_os_dep/app1
; npm version = 10.8.1
; cwd = /npm_transitive_os_dep/app1
; HOME = /root
; Run `npm config ls -l` to show all defaults.