nvm 在新的终端会话中“忘记”了 node

828

在OS X中使用新的终端会话后,nvm忘记了节点版本并默认为空:

$ nvm ls

         .nvm
     v0.11.12
     v0.11.13

每次会话都需要输入nvm use v.0.11.13

         .nvm
     v0.11.12
->   v0.11.13

我尝试过使用brew安装和官方的安装脚本。

我使用brew版本的.profile

#nvm
export NVM_DIR=~/.nvm
source $(brew --prefix nvm)/nvm.sh

对于 install.sh 脚本:

$ curl https://raw.githubusercontent.com/creationix/nvm/v0.10.0/install.sh | bash

#nvm
export NVM_DIR="/Users/farhad/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm

我做错了什么,你有什么线索吗?


2
只是想在这里补充一下 - 确保你从.bash_profile导出,而不是你的.bashrc - James111
在 Mac OS 上,.bash_profile 和 .bashrc 有什么区别? - vikramvi
31个回答

1589
尝试使用nvm alias default命令。例如:$ nvm alias default 0.12.7
这个命令会在你的shell中设置默认的Node版本。然后,通过关闭当前shell窗口并打开一个新窗口来验证更改是否生效,接着运行node --version命令。

2
对我来说没有起作用,而且我没有遇到Maxwell所说的问题。我没有使用brew,但我升级/重新安装了我的nvm,问题就解决了。 - Jonah
56
如果这不起作用,确保在你的.bash_profile(或.bashrc或其他文件)中,在source xx/nvm.sh之后没有任何修改PATH的内容。 - goodmanship
1
@KellyS.French(nvm维护者在此)nvm从未达到1.0版本-您可能已经通过npm安装了它。请仅使用http://nvm.sh上的curl脚本进行安装,您将获得正确的版本。 - LJHarb
1
@KellyS.French 啊!nvm 不支持 Windows(除了 BashOnWindows)- 你可能有 nvm-windows,这是一个不同的项目。 - LJHarb
1
在使用jorgebucaran/nvm.fish的Fish Shell中,我遇到了“nvm:未知的命令或选项:“alias”(请参阅nvm -h)”的错误。我猜那里需要使用“set --universal nvm_default_version $VERSION”。 - andresp
显示剩余14条评论

177

node 自身设置为别名,以避免在以后的 Node.js 版本更新中更新默认别名。

nvm alias default node

2
这实际上比给特定版本设置别名更好(另一个答案)。这也是https://github.com/creationix/nvm#install-script建议的方法。 - Tom
如果设置默认别名不起作用,
  1. 尝试将export NVM_DIR=....移动到bash配置文件的最后
  2. 如果这也不起作用,请卸载nvm并重新安装它,并安装您想要的节点版本。 不要花太多时间寻找解决方案。重新安装非常快速。
- Krishna Pravin
看起来这种方法已经不再适用(2022-11-15)。根据文档,node 本身是指向系统上最新版本的别名。https://github.com/nvm-sh/nvm#usage - aryzing
这应该是最佳答案,但我猜它永远不会成为。投票者并不总是选择正确的选择... 悲哀。 - Nabil Kadimi

96

在我的情况下,另一个程序已经向.bashrc添加了PATH更改。

如果这个程序在nvm初始化后改变了PATH,那么nvm的PATH更改将被遗忘,我们会在PATH上得到系统节点(或没有节点)。

解决方案是将nvm设置移到.bashrc的底部

### BAD .bashrc ###

# NVM initialisation
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm

# Some other program adding to the PATH:
export PATH="$ANT_ROOT:$PATH"

解决方案:

### GOOD .bashrc ###

# Some other program adding to the PATH:
export PATH="$ANT_ROOT:$PATH"

# NVM initialisation
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm

(这是在CentOS上使用bash 4.2.46时发生的。我认为这似乎是bash中的一个错误,但我可能错了。)


(This was with bash 4.2.46 on CentOS. It seems to me like a bug in bash, but I may be mistaken.)

4
给这个人颁发一枚奖章!在我的zshrc中进行了其他*rc文件的额外加载,这让我疯了。感谢您! - bobbytables
1
谢谢!这让我疯了。 - Trees
1
@vikramvi 我们在最后一行做了。\.source相同。[ -s ... ]只是检查文件是否存在且不为空。如果您想知道为什么不仅将源代码行移动到底部,而且将export NVM_DIR保留在原来的位置,唯一的原因是为了保持NVM行清晰易懂地放在一起。如果您愿意,可以将它们分开。 - joeytwiddle
1
是的,这对我有用。否则,每次打开新终端时都会看到默认还原。 - sails44
1
我不明白为什么$PATH变量中完全不相关的路径会影响Node版本?你的“其他程序”是否修改了Node路径? - MuhsinFatih
显示剩余5条评论

55

安装最新的稳定版本:

nvm install stable

将默认版本设置为稳定版(而不是特定版本):

nvm alias default stable

列出已安装的版本:

nvm list

v6.2.0版本开始,它将看起来像这样:

$ nvm list
         v4.4.2
->       v6.2.0
default -> stable (-> v6.2.0)
node -> stable (-> v6.2.0) (default)
stable -> 6.2 (-> v6.2.0) (default)
iojs -> N/A (default)

这个很好用,使用 nvm list 的建议可以帮助用户可视化他们的版本控制。谢谢! - png

32

在我的环境中,这些解决方案都无效,无论如何 nvm 都似乎会加载安装的第一个 node 版本(除非您通过 nvm use 暂时更改它)。

我找到的唯一更改默认版本的方法是:

  • 清除 nvm 缓存:nvm cache clear
  • 将默认版本设置为所需的版本:nvm alias default 12(或任何其他版本)
  • 切换到所需的版本:nvm use 12
  • 卸载所有其他版本:
    • nvm ls(列出安装列表)
    • nvm uninstall x(对于不是默认版本的每个安装运行此命令)
  • 重新安装其他版本:nvm install x

您可以使用此脚本自动执行此过程(只需将第一个变量更改为所需的版本)- 它将自动重新安装您之前拥有的所有版本。

DEFAULT_NVM_VERSION=16
nvm cache clear
nvm install $DEFAULT_NVM_VERSION
nvm alias default $DEFAULT_NVM_VERSION
NVERS=$(nvm ls --no-alias | grep -v -- "->" | grep -o "v[0-9.]*")
while read ver; do nvm uninstall $ver; done <<< $NVERS
while read ver; do nvm install $ver; done <<< $NVERS
nvm use $DEFAULT_NVM_VERSION

或者作为一行代码:

DEFAULT_NVM_VERSION=16 && nvm cache clear && nvm install $DEFAULT_NVM_VERSION && nvm alias default $DEFAULT_NVM_VERSION && NVERS=$(nvm ls --no-alias | grep -v -- "->" | grep -o "v[0-9.]*") && while read ver; do nvm uninstall $ver; done <<< $NVERS && while read ver; do nvm install $ver; done <<< $NVERS && nvm use $DEFAULT_NVM_VERSION

新终端现在应该遵循默认版本。


谢谢!其他的解决方案对我也没有用。也许这是最近 nvm 的一个 bug。 - B T
谢谢,但把它们都放在一行上有什么意义呢?对我起作用的那一行是 nvm alias default 16 - Phil
@Phil 这个解决方案是针对 nvm alias default 命令无法工作的情况(似乎很多人都无法使用它) - protango
这是我能让它工作的唯一方法,谢谢。 - undefined
对我来说似乎不起作用。 - undefined

30

nvm通过更改PATH变量来实现其工作,因此在调用nvm.sh脚本后,请确保您没有以某种方式将PATH更改为其他内容。

在我的情况下,nvm.sh被调用于.bashrc文件中,但随后在.bash_profile中更新了PATH变量,这导致我的会话在找到nvm节点之前先找到系统节点。


1
我该如何检查这个?我怀疑这是原因。 - Mild Fuzz
这是我的情况,谢谢!我将导出设置放在了我的.zshrc文件的顶部,只需将其移动到底部,问题就解决了。 - Alejandro Silva
那正是我的情况。解决方法是将NVM的~/.bash_profile条目移动到文件末尾,然后设置nvm alias defaultnvm use为我所需的版本。 - Eugene Tartakovsky
1
这对我来说是解决方案。将以下内容移至 .bashrc 的底部:export NVM_DIR="$HOME/.nvm" 然后执行 . "/usr/local/opt/nvm/nvm.sh" - asmiller
同样的情况。我将nvm脚本从.bashrc移动到.bash_profile,但仍然不起作用。然后我设置了nvm alias default并将nvm脚本移回.bashrc。问题解决了。 - Marvin Xu

29

这里是简单的说明:

1)安装:

nvm install 8.10.0

2) 每个终端使用一次

nvm use 8.10.0

3) 将其设置为所有终端的默认值

nvm alias default 8.10.0

您可能需要使用 root 权限执行这些操作。

不要忘记查看 nvm 文档以获取更多信息。

还请注意,您的 IDE 可能需要指定节点版本:enter image description here


谢谢!在我的情况下,通过在 VS Code 终端中运行以下命令解决了问题:nvm use 16.14.2,然后重启 VS Code。太好了! - Adriana Hernández
1
非常感谢,您节省了我一个小时的搜索时间!没有一个答案对我有用...我一直在寻找nvm use <version> - Adarsh Raj
1
非常感谢你,节省了我一个小时的搜索时间!所有的答案对我都不起作用...我一直在寻找nvm use <version> - undefined

14

评分最高的解决方案对我似乎不起作用。下面是我的解决方案:

  1. 使用homebrew完全卸载nvm:brew uninstall nvm
  2. 重新安装 brew install nvm
  3. 在终端中按照以下步骤操作(这些步骤也在通过homebrew安装nvm时列出):

    mkdir ~/.nvm cp $(brew --prefix nvm)/nvm-exec ~/.nvm/ export NVM_DIR=~/.nvm source $(brew --prefix nvm)/nvm.sh

上述步骤将把NVM的工作目录添加到您的$HOME路径中,将nvm-exec复制到NVM的工作目录并添加到$HOME/.bashrc、$HOME/.zshrc或您的shell等效配置文件。(再次引用自使用homebrew安装NVM时列出的内容)


9
如果你已经尝试了所有方法还是没有成功,你可以尝试以下方法:_
1 -> 卸载 NVM
rm -rf ~/.nvm

2 -> 按照这个链接的说明,删除npm依赖项。

3 -> 安装NVM

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

4 -> 设置~/.bash_profile配置

运行 sudo nano ~/.bash_profile

复制并粘贴以下内容

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

5 -> CONTROL + X 保存更改。

6 -> 运行 . ~/.bash_profile

7 -> 现在您的机器上应该安装了nvm,要安装node,请运行nvm install v7.8.0。这将是默认的node版本,或者您可以安装任何版本的node。


1
非常感谢!这是唯一一个在bash中设置节点路径并对我有效的解决方案。我只是使用“nvm install node”安装了最新的节点版本,而不是使用“nvm install v7.8.0”。 - ajay
我认为在4中你不需要通过sudo提升权限。我会编辑答案以删除此部分,因为在这里特权升级似乎没有任何好处,因为该答案可以在主目录中运行。如果情况不是这样,请告诉我原因 - 谢谢! - Jason R Stevens CFA

9

我使用ZSH,所以我需要按照以下顺序修改~/.zshrc文件中与NVM相关的代码行:

[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm
source ~/.nvm/nvm.sh

1
谢谢。如果有人在ZSH上遇到问题,这个解决方案是最简单的。 - Akash Kumar Seth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接