Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

n <version> command does not activate specified version

Tags:

node.js

n

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.

like image 372
lkisac Avatar asked Apr 08 '20 20:04

lkisac


2 Answers

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
like image 187
lkisac Avatar answered Oct 03 '22 17:10

lkisac


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
like image 44
shadowspawn Avatar answered Oct 03 '22 17:10

shadowspawn