"nvm use" not persisting
YourDeveloperFriend opened this issue Β· 62 comments
Sorry, I'm sure this is a duplicate, but I can't find anything in the miriad of issues. I'm running on Ubuntu 14.04, nvm version 0.23.3, and I just recently installed nvm. I used to be on n
but I switched here in order to try out iojs, so it's possible that some residual n
is conflicting with nvm. I removed all the node versions with n
except 0.12.0, uninstalled n
, installed nvm
, and I properly sourced nvm as mentioned in issue #394. Then I ran into the following issue:
$ nvm current
v0.12.0
$ nvm install 0.10
######################################################################## 100.0%
Now using node v0.10.36
$ nvm current # NOTE: didn't change
v0.12.0
$ node -v
v0.12.0
$ nvm use 0.10
Now using node v0.10.36
$ nvm current
v0.12.0
$ node -v
v0.12.0
$ nvm install iojs
######################################################################## 100.0%
WARNING: checksums are currently disabled for io.js
Now using io.js v1.2.0
$ nvm current
iojs-v1.2.0
$ node -v # NOTE: didn't change AND different from nvm current
v0.12.0
This all works just fine when run in sudo su
, but when I exit that shell, it doesn't permeate.
More possible clues:
$ nvm run 0.10 -v
Running node v0.10.36
v0.12.0
$ nvm exec 0.10 node -v
Running node v0.10.36
v0.10.36
$ nvm run iojs -v
Running io.js v1.2.0
v1.2.0
Not sure how to proceed.
nvm use
isn't meant to persist - it's only for the lifetime of the shell.
You can either do nvm alias default node
if you want that to be the default when opening new shells, or, you can make a .nvmrc
file that will take precedence anywhere in the current directory, upwards to /
.
I don't understand. It's not persisting at all, let alone for the lifetime of the shell. Please read the issue again:
This is all one shell:
$ nvm current
v0.12.0
$ nvm install 0.10
######################################################################## 100.0%
Now using node v0.10.36
$ nvm current # NOTE: didn't change
v0.12.0
$ node -v
v0.12.0
$ nvm use 0.10
Now using node v0.10.36
$ nvm current
v0.12.0
$ node -v
v0.12.0
$ nvm install iojs
######################################################################## 100.0%
WARNING: checksums are currently disabled for io.js
Now using io.js v1.2.0
$ nvm current
iojs-v1.2.0
$ node -v # NOTE: didn't change AND different from nvm current
v0.12.0
You may have been confused by this comment:
This all works just fine when run in sudo su, but when I exit that shell, it doesn't permeate.
In other words, it works as intended within sudo, but not in my regular shell.
Ah, sorry, responding too quickly :-)
What does which node
, echo $PATH
, which iojs
, and npm root -g
report at all those steps?
Also, how did you install nvm
? (Note that homebrew is not supported or recommended)
Under what user did you install nvm
? (nvm
must be installed once for each user account you want to use with it; it's not meant for being shared across accounts)
$ which node
/home/yourdeveloperfriend/.nvm/versions/node/v0.12.0/bin/node
$ echo $PATH
/home/yourdeveloperfriend/.nvm/versions/node/v0.12.0/bin:/home/yourdeveloperfriend/.rbenv/plugins/ruby-build/bin:/home/yourdeveloperfriend/.rbenv/shims:/home/yourdeveloperfriend/.rbenv/bin:/usr/local/heroku/bin:/home/yourdeveloperfriend/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/yourdeveloperfriend/.rvm/bin:~/www/phantomjs/bin:/home/yourdeveloperfriend/.rvm/bin
$ which iojs # no response.
$ npm root -g
/home/yourdeveloperfriend/.nvm/versions/node/v0.12.0/lib/node_modules
I installed nvm via my one user: yourdeveloperfriend. I installed with the install script: curl https://raw.githubusercontent.com/creationix/nvm/v0.23.3/install.sh | bash
- I'm on Ubuntu 14.04. I don't have any other user accounts.
And don't worry about closing the issue too quickly, I understand you guys probably have a lot of garbage to sort through. Thanks for your help.
@YourDeveloperFriend When you're in the above situation (where 0.10 and 0.12 are installed, 0.12 is active, and nvm use 0.10
doesn't seem to have any effect), what happens if you do nvm deactivate
and then check which node ; node -v
?
$ nvm deactivate
/home/yourdeveloperfriend/.nvm/*/bin removed from $PATH
/home/yourdeveloperfriend/.nvm/*/share/man removed from $MANPATH
$ which node
/usr/local/bin/node
$ node -v
0.12.0
This is very confusing :-) so, when you start with nvm deactivate
, your PATH
should be such that nvm current
reports "system" (ie, /usr/local/bin/node
). From there, nvm use iojs
for example should activate the latest io.js
version, and your PATH
should be such that nvm current
and node -v
report that io.js
version, and so on. From there, nvm use 0.10
should remove the io.js
path from your PATH
, and then add the 0.10 version to it, and then nvm current
and node -v
should report the 0.10 version.
The only thing I can thing of is that somewhere in that chain, the PATH
changes aren't happening - either the removal, or the addition.
What's the output of alias
? Just want to make certain that you don't have any builtins aliased - even though we use command
internally for most of them to bypass aliases.
That was it! I had an alias in my .bashrc
setting node='nodejs'. I think I remember needing to put that in there when I first installed nodejs... But why? I guess this has nothing to do with nvm
. Thanks!
ah HA! Yay, thanks for working through it with me!
If you originally installed node
via apt
, the default Ubuntu package is called "nodejs", so I suspect that's the origin.
So should I uninstall node
via apt
? I feel uncomfortable about there being two versions of node on my system, that may be confusing in the future...
Yes, absolutely. It won't cause problems, but as we've seen it could definitely cause confusion :-)
Just a not to say that I had been struggling with this for a long time on ubuntu and removing alias node='nodejs'
from .bashrc fixed it.
(In pre-nvm
days adding the alias to .bashrc was the recommended way of getting to node to run on ubuntu)
I'm experiencing this same issue with the latest nvm (0.29.0
) - is the protocol to open a new issue?
I have node installed in my system, ran the nvm install script, set the NVM_DIR
variable & sourced the nvm shell script in my shell profile.
# /usr/local/bin/node
which node
# v4.2.4
node -v
# /Users/thelostspore/.nvm
echo $NVM_DIR
nvm install 0.12.9
nvm alias default 0.12.9
nvm use default
# /Users/thelostspore/.nvm/versions/node/v0.12.9/bin/node
which node
nvm is installed and behaving normally except that the new shell sessions always revert to the system version of node. Am I missing something?
@thelostspore let's debug here for a moment - can you gist the output of nvm debug
, and the contents of your bashrc (or appropriate profile) file?
Thanks @ljharb
Output of nvm debug
:
$SHELL: /bin/bash
$NVM_DIR: '$HOME/.nvm'
$PREFIX: ''
$NPM_CONFIG_PREFIX: ''
nvm current: system
which node: /usr/local/bin/node
which iojs:
which npm: /usr/local/bin/npm
npm config get prefix: /usr/local
npm root -g: /usr/local/lib/node_modules
~/.bash_profile
sources from my ~/.bashrc
. The relevant nvm
portion:
export NVM_DIR=~/.nvm
source $(brew --prefix nvm)/nvm.sh
I think its worth mentioning that I first attempted install via the nvm
install script, then a manual install, before finally a homebrew install (uninstalling nvm before each new attempt). Currently nvm
is installed via homebrew and everything appears to be working aside from the default node version in new shell sessions.
Also, I placed an .nvmrc
with the desired default node version in my home directory. Still no luck.
nvm
is entirely unsupported when installed via homebrew - can you try brew uninstalling it, and installing it just with the install script, and then I should be able to help you get everything working?
Ok, uninstalled nvm
via homebrew, ran install script, installed node (0.12.9), and set as default.
nvm debug
$SHELL: /bin/bash
$NVM_DIR: '$HOME/.nvm'
$PREFIX: ''
$NPM_CONFIG_PREFIX: ''
nvm current: v0.12.9
which node: $NVM_DIR/versions/node/v0.12.9/bin/node
which iojs:
which npm: $NVM_DIR/versions/node/v0.12.9/bin/npm
npm config get prefix: $NVM_DIR/versions/node/v0.12.9
npm root -g: $NVM_DIR/versions/node/v0.12.9/lib/node_modules
The nvm
command is available in new shells but the system
version of node is the default (nvm current
).
Thanks again for looking into this.
ok so nvm alias default node
works? what does nvm alias
print out? when you open a new shell, is the above what nvm debug
prints out? Can you confirm what nvm current
prints out with the above nvm debug
printout?
I don't think the alias
command is working as expected.
nvm use default
# 0.12.9
nvm current
# default -> node (-> v4.2.4) .. this should be 0.12.9, according to `nvm alias`
nvm alias default node
nvm alias
default -> node (-> v4.2.4)
node -> 0.12 (-> v0.12.9)
system -> 4.2 (-> v4.2.4)
stable -> 4.2 (-> v4.2.4) (default)
iojs -> N/A (default)
Same results with nvm alias default 0.12
. In a new shell nvm current
yields system
.
aha! @thelostspore try nvm unalias node
. you may have ran nvm alias node 0.12
at some point, and I don't think that's a scenario i'd anticipated. also, what's ls -la $NVM_DIR
print out?
Ok, removed all aliases (I definitely tried nvm alias node 0.12
;) ), and then tried setting the default again. nvm current
in new shells still yields system
.
$NVM_DIR
drwxr-xr-x 20 thelostspore staff 680B Dec 24 16:23 .
drwxr-xr-x+ 52 thelostspore staff 1.7K Dec 24 16:20 ..
drwxr-xr-x 13 thelostspore staff 442B Dec 24 16:20 .git
-rw-r--r-- 1 thelostspore staff 12B Dec 24 16:20 .gitattributes
-rw-r--r-- 1 thelostspore staff 117B Dec 24 16:20 .gitignore
-rw-r--r-- 1 thelostspore staff 14B Dec 24 16:20 .npmignore
-rw-r--r-- 1 thelostspore staff 1.4K Dec 24 16:20 .travis.yml
-rw-r--r-- 1 thelostspore staff 763B Dec 24 16:20 CONTRIBUTING.md
-rw-r--r-- 1 thelostspore staff 1.1K Dec 24 16:20 LICENSE.md
-rw-r--r-- 1 thelostspore staff 5.1K Dec 24 16:20 Makefile
-rw-r--r-- 1 thelostspore staff 8.9K Dec 24 16:20 README.markdown
drwxr-xr-x 3 thelostspore staff 102B Dec 25 11:08 alias
-rw-r--r-- 1 thelostspore staff 1.8K Dec 24 16:20 bash_completion
drwxr-xr-x 4 thelostspore staff 136B Dec 25 10:51 bin
-rwxr-xr-x 1 thelostspore staff 7.5K Dec 24 16:20 install.sh
-rwxr-xr-x 1 thelostspore staff 304B Dec 24 16:20 nvm-exec
-rwxr-xr-x 1 thelostspore staff 65K Dec 24 16:20 nvm.sh
-rw-r--r-- 1 thelostspore staff 1.4K Dec 24 16:20 package.json
drwxr-xr-x 9 thelostspore staff 306B Dec 24 16:20 test
drwxr-xr-x 3 thelostspore staff 102B Dec 24 16:22 versions
great, and inside $NVM_DIR/alias
?
Only default
exists, contents are 0.12
ok - so just to confirm once more: new shell, nvm
works fine, but nvm current
starts out as system
, despite the presence of nvm alias default
. There's no other aliases. There isn't any .nvmrc
file (and adding one doesn't change the behavior), and nvm use 0.12
works fine. What does nvm use
with no arguments print out? Also, what about echo $PATH
? it's possible that you're setting your system node's PATH after nvm
is loaded.
π€¦
PATH issue. Was sourcing nvm init script before PATH modifications. Sorry to waste your time.
Would it be helpful if I opened a pull and added a few gotchas to the readme?
hooray, glad we figured it out. Sure, documentation PRs are always welcome!
for those who have similar problem, forcing npm
prefix
config also causes this issue!
The "prefix" config is not supported by nvm
, so please don't use it.
nvm alias default 6.3.0
resolved my issue, version number being the last argument
nvm alias default node
works as well.
haven't seen such a positive and constructive issue thread in a while - good job @ljharb
FWIW
I had to delete .nvm/current
, an alias to the version mine was stuck on.
pretty sure this was a side effect of having installed via brew.
I uninstalled via brew and installed via the README
... that current
alias, however, was still hanging around.. deleting that resolved it.
also kudos @ljharb for being helpful AF
That current
alias is from an older version of nvm - by default now, it's not created at all, unless an env var is set.
@wq1308786830 windows nvm isn't this project; that's nvm-windows
- it's linked from the readme. You're on the wrong repo.
@ljharb thanks
use
nvm alias default
eg
nvm alias default 8.9.3
Having similar problems as some other users above and have tried all suggestions given but I'm still seeing some unexpected behavior. I'm on mac os with zsh, installed properly from the readme and most behaviors work as intended, except when I source my zshrc file.
- I start a new terminal and it uses 9.3 as my desired default.
- I source my zsh file then it reverts to using system node vs default.
I should also add that if afterwards I use nvm use default
it correctly changes my select to 9.3
Here is whats in my zshrc that seems relevant:
export PATH="~/.yarn/bin:/usr/local/bin:/usr/local/sbin:~/bin:$PATH"
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
The "prefix" error is the issue; do you have an ~/.npmrc
file, or any env vars set with "prefix" in their name?
I do not have a /.npmrc
file and do not believe I have any env vars set with "prefix".
Also I'm very impressed with your response time and the previous responses you've given. Thank you!
@JonahMoses would you mind filing a new issue for this one? I assume that at the end of that screenshot, nvm use node
would error out with that prefix error?
For me when I do nvm alias default 6.11.0
it wasn't persistent, each time when I close iTerm (my shell) it was getting set to4.4.4
, which isn't what I had set.
This trick work for me, goto /Users/anjum/.nvm/alias
folder open default
file and changed 4.4
to 6.11
Thanks
@anjum121 that suggests that the permissions on that file aren't correct; such that nvm alias default whatever
is able to change it.
nvm alias default xxx
(https://eric.blog/2016/08/23/set-default-node-version-with-nvm/) does the trick
That was it! I had an alias in my
.bashrc
setting node='nodejs'. I think I remember needing to put that in there when I first installed nodejs... But why? I guess this has nothing to do withnvm
. Thanks!
This is sort of a fix when using Yarn. many people suggest it to get rid of issues with node/nodejs naming problems with packages and using yarn.
The only thing that should ever care about βnodejsβ is ubuntuβs broken (for node) default repository; it shouldnβt ever be required.
How can I run a node script to change environment?
const {execSync} = require('child_process');
execSync('. ~/.nvm/nvm.sh && nvm use v12.9.1', {encoding: 'utf8'});
execSync('npm version', {encoding: 'utf8'}); // => try to use node@12.9.1
Even if:
execSync('. ~/.nvm/nvm.sh && node build.js'); // cannot use nvm within build.js
But actually it does not work, and how can I do this?
@aleen42 you pretty much can't. nvm is a sourced shell function, so it's only usable within the same shell session you sourced nvm.sh in. In your example, you'd have to combine every v12.9.1 command into the same execSync
call.
this didn't work for me on circleci. the only way that I could get it to work was by uninstalling the version of node that the circleci image shipped with. the default alias was then respected by new shells/run steps as expected
Hi guys, reading through the above, it isn't entirely clear if there was a solution to this, at least for Ubuntu/Linux latest versions.
Anyone have a succint summary?
Thanks for you assistance.
@markcollinscope this specific issue was caused by trying to alias node to βnodejsβ. If you have a different problem, please file a new issue and fill out the full issue template.
How can I run a node script to change the environment?
const {execSync} = require('child_process'); execSync('. ~/.nvm/nvm.sh && nvm use v12.9.1', {encoding: 'utf8'}); execSync('npm version', {encoding: 'utf8'}); // => try to use node@12.9.1Even if:
execSync('. ~/.nvm/nvm.sh && node build.js'); // cannot use nvm within build.jsBut actually it does not work, and how can I do this?
Finally, we have used a standalone docker image to build up CI and using environment parameters to specify the node version with nvm when starting up a pipeline.
@markcollinscope How are you loading nvm into your shell?
In my case, I did something wrong which was adding the lines:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
to my .profile
, which caused the $PATH to be pointing to the old folders, even after replacing the aliases with nvm alias
Anyways, closing the user session and reopening did the job.
And after I've removed those lines from the .profile
and added into my .zshrc
@LuuchoRocha - thank you for your input. I will check this out and get back to you to let you know. Appreciated!
Unfortunately, this seems broken, at least on linux:
My aliases:
nvm ls
v16.20.0
-> v18.16.0
default -> 16.20.0 (-> v16.20.0)
node -> default (-> v16.20.0)
stable -> default (-> v16.20.0)
iojs -> N/A (default)
unstable -> N/A (default)
lts/* -> lts/hydrogen (-> v18.16.0)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.12 (-> N/A)
lts/fermium -> v14.21.3 (-> N/A)
lts/gallium -> v16.20.0
lts/hydrogen -> v18.16.0
You will notice that 18 is active even though both the node
and default
are set to 16. Of course, this means node --version
is 16.20.0
.
My .zshrc
:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
Linux Kernel:
uname -r
6.2.10-300.fc38.x86_64
In order for my preference for 16 to persist across session, I had to nvm use default
(because the active was still 18 for some reason) followed by a nvm uninstall 18
@baughmann what version of nvm do you have? node
isn't supposed to point at default
, so you may need to run nvm unalias node
.
@ljharb I pointed node
to default
manually in an attempt to get it to work when simply aliasing default
did not. I'm using nvm version 0.39.3, apologies for not mentioning that
In case this helps anyone else: I was struggling with this and could not get nvm alias default node
or nvm alias default 20
to work. New shells would always use v18.16.1
. I had no system node and which node
and $PATH
all looked right.
After doing a simple nvm uninstall 18
, I can successfully change the default version used in new terminals.