lkisac
lkisac

Reputation: 2137

n <version> command does not activate specified version

Currently I have two versions of node installed on a Jenkins server.

$ n list
node/10.9.0
node/12.14.1

I'm trying to switch to version 10.9.0 for a specific build which requires it.

I've tried first by using n <version> but the latest 12.14.1 still shows as active:

$ n 10.9.0
installed : v10.9.0 to /opt/jenkins/n/bin/node
   active : v12.14.1 at /bin/node

I've also tried n use <version> which just follows up with a prompt.

$ n use 10.9.0
>

I've read various articles on this but could not get any commands to effectively switch versions.

i.e. https://blog.logrocket.com/switching-between-node-versions-during-development/

Below is the n exectuable.

which n
/opt/jenkins/n/bin/n

Versions appear to get installed under the below directory:

/opt/jenkins/n/n/versions/node/
10.9.0  
12.14.1

Below are the contents of /opt/jenkins/n/bin/

chrome-debug -> ../lib/node_modules/lighthouse/lighthouse-core/scripts/manual-chrome-launcher.js
lighthouse -> ../lib/node_modules/lighthouse/lighthouse-cli/index.js
n
ng
node
nodejs
npm -> ../lib/node_modules/npm/bin/npm-cli.js
npx -> ../lib/node_modules/npm/bin/npx-cli.js
n-uninstall
n-update

How can I switch node versions with n? Is there anything in the above that is missing? Thanks in advance.

Upvotes: 21

Views: 22401

Answers (4)

Achraf Amil
Achraf Amil

Reputation: 1375

Not sure it's the best option, but I manually did an export PATH= with whatever was the output of echo $PATH minus the substring /Users/achraf/.nvm/versions/node/v14.21.3/bin: (that was at the very beginning) and now my active version is not shadowed anymore.

Upvotes: 1

8bitjoey
8bitjoey

Reputation: 1116

If you use brew and see something like this:

$ n                                                                                                                                          
     copying : node/16.19.1
   installed : v16.19.1 to /usr/local/bin/node
      active : v19.7.0 at /opt/homebrew/bin/node

Just run brew unlink node to let n manage node versions again.

Upvotes: 44

shadowspawn
shadowspawn

Reputation: 3825

You have copies of node installed to multiple locations, but only one of the locations is managed by n (which is set using N_PREFIX). Your PATH includes the copy installed by n later, so is not run when you just type node.

See also n doctor which looks for a few configuration issues including this one.

One possible solution is to have the location you want to use earlier in your path, another is to delete the node copy you don't want. However, you can run the n managed copy of node directly too which might be a good match for a CI type situation and not require any configuration changes.

n run (or n use) run the version of node you specify as a one-off command. e.g.

$ n run 10.9.0 --version
v10.9.0
$ n run 10.9.0  -e 'console.log("hello")'
hello
$ n run 10.9.0  my-script.js

Upvotes: 5

lkisac
lkisac

Reputation: 2137

After running which node the path shows /bin/node.

/bin/node is a symlink to /opt/jenkins/n/bin/nodejs.

$ ll /bin/node
lrwxrwxrwx 1 root root 25 Jan 28 08:26 /bin/node -> /opt/jenkins/n/bin/nodejs

When installing, with n <version> it updates /opt/jenkins/n/bin/node only.

$ n 10.9.0
   installed : v10.9.0 to /opt/jenkins/n/bin/node
      active : v12.14.1 at /bin/node

Once this is done, node needs to be copied to nodejs.

$ cp /opt/jenkins/n/bin/node /opt/jenkins/n/bin/nodejs
$ node -v
v10.9.0

Upvotes: 13

Related Questions