npm / cli

the package manager for JavaScript

Home Page:https://docs.npmjs.com/cli/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[BUG] npx does not respect version range if a compatible version is found inside any package installed globally

mshima opened this issue · comments

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

Installed package is used even if the version range does not match.

npm install -g generator-jhipster@8.3.0 generator-jhipster-native@2.1.0
npx generator-jhipster@8.4.0 --version
8.3.0

Expected Behavior

The version range should be respected.

npm install -g generator-jhipster@8.3.0
npx generator-jhipster@8.4.0 --version
8.4.0

Steps To Reproduce

No response

Environment

  • npm: 10.7.0
  • Node.js: v18.20.2
  • OS Name: MacOS
  • System Model Name: MacBook Air
  • npm config:
; "builtin" config from /opt/homebrew/lib/node_modules/npm/npmrc

prefix = "/opt/homebrew"

; "user" config from /Users/mshima/.npmrc

//registry.npmjs.org/:_authToken = (protected)

; node bin location = /usr/local/bin/node
; node version = v18.20.2
; npm local prefix = /Users/mshima/git/test
; npm version = 10.7.0
; cwd = /Users/mshima/git/test
; HOME = /Users/mshima
; Run `npm config ls -l` to show all defaults.

For me it's showing correct version

~ $ npx generator-jhipster@8.4.0 --version
8.4.0
~ $ npm ls -g 
/Users/testing/.nvm/versions/node/v22.0.0/lib
├── corepack@0.26.0
├── generator-jhipster@8.3.0
├── latest@0.2.0
└── npm@10.7.0
% npx -v
10.7.0
% npx generator-jhipster@8.4.0 --version
8.3.0
% npm ls -g
/opt/homebrew/lib
.
├── generator-jhipster@8.3.0
.

Anything else I could do to debug?

does you cwd has that package installed ?
what does npm ls shows from where you are running the command ?

does you cwd has that package installed ? what does npm ls shows from where you are running the command ?

It's an empty folder.

% npm ls
/Users/mshima/git/test
└── (empty)

@milaninfy I think a found a way to reproduce:

npm install -g generator-jhipster@8.3.0 generator-jhipster-native@latest
% npx generator-jhipster@8.4.0 --version
8.3.0

If I remove every global package and install the generator-jhipster, it works.
Then if I install generator-jhipster-native that have generator-jhipster@8.4.0 as a dependency, the problem is reproducible.

I've added a console.log in /usr/local/lib/node_modules/npm/node_modules/libnpmexec/lib/index.js:

      // package requested by specific version
      if (spec.type === 'version' && (node.pkgid === spec.raw)) {
        console.log(node)
        return { node }

It prints:

% npx generator-jhipster@8.4.0 --version
⠦ArboristNode {
  name: 'generator-jhipster',
  version: '8.4.0',
  location: 'node_modules/generator-jhipster-native/node_modules/generator-jhipster',
  path: '/usr/local/lib/node_modules/generator-jhipster-native/node_modules/generator-jhipster',
.
.
.
8.3.0

generator-jhipster inside generator-jhipster-native is found. But the root (8.3.0) is used.

commented

Duplicated in a workspace off of latest

@wraithgar ➜ /workspaces/cli (latest) $ npx generator-jhipster@8.4.0 --version
8.3.0
@wraithgar ➜ /workspaces/cli (latest) $ npm ls -g
/usr/local/share/nvm/versions/node/v20.12.1/lib
├── corepack@0.25.2
├── generator-jhipster-native@2.1.0
├── generator-jhipster@8.3.0
├── npm@10.5.0
└── pnpm@8.15.6