NVM在新的终端会话中保持“忘记”节点

在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安装,以及官方安装脚本。

我的.profile用于brew版本:

#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

知道我做错了什么吗?

224097 次浏览

试试nvm alias default。例如:

$ nvm alias default 0.12.7

这将在您的shell中设置默认节点版本。然后通过关闭shell窗口、打开一个新窗口来验证更改是否持续,然后: node --version

NVM通过更改PATH变量来完成其工作,因此您需要确保在获取nvm.sh脚本后不会以某种方式将PATH更改为其他内容。

在我的例子中,nvm.sh在. bashrc中被调用,但随后PATH变量在.bash_profile中更新,这导致我的会话在nvm节点之前找到系统节点。

node本身的别名,以避免稍后更新默认别名以及节点版本更新。

nvm alias default node

顶级的解决方案似乎对我不起作用。我的解决方案如下:

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

    mkdir~/. nvm cp$(brew--pre重塑nvm)/nvm-exec~/. nvm/ 导出NVM_DIR=~/. nvm source$(brew--pre重塑nvm)/nvm.sh

上面列出的步骤将把NVM的工作目录添加到$HOME路径,将nvm-exec复制到NVM的工作目录,然后添加到$HOME/. bashrc、$HOME/. zshrc或shell的等效配置文件。

这个问题已经提到了OSX,但它发生在我的linux操作系统中。 我尝试使用nvm alias default <version>,但对于每个新的终端会话,都忘记了使用的节点版本。 所以,这是我想出的解决方案。

确保为节点版本设置默认别名,将以下代码放入. bashrc和source .bashrc

export NVM_DIR="/home/bonnie/.nvm"
## If the file exists and is not empty
if [ -s "$NVM_DIR/nvm.sh" ]; then
## Source it
source "$NVM_DIR/nvm.sh"
fi
NODE_DEFAULT_VERSION=$(<"$NVM_DIR/alias/default")
export PATH="$NVM_DIR/versions/node/$NODE_DEFAULT_VERSION/bin":$PATH

描述性解决方案链接

安装任何版本后运行它,

n=$(which node);n=${n%/bin/node}; chmod -R 755 $n/bin/*; sudo cp -r $n/{bin,lib,share} /usr/local

此命令将您通过nvm活动的任何版本的节点复制到 /usr/local/目录中,并设置权限,以便所有用户都可以访问它们。

要安装最新的稳定版本:

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之前安装了节点,请检查您的~/.bash_profile是否有以下内容:

export PATH=/bin:/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH

如果你有它,注释/删除它,nvm应该开始处理默认节点版本。

在我的例子中,另一个程序将PATH更改添加到.bashrc

如果其他程序更改了PATH之后 nvm的初始化,那么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中的bug,但我可能弄错了。)

我在这里找到了一种新的方法。使用n交互式管理您的Node.js 有帮助。

如果你已经尝试了一切仍然没有运气,你可以试试这个:_

1->卸载NVM

rm -rf ~/.nvm

2->按照这个删除npm依赖项

3->安装NVM

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

4->Set~/.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,要安装节点运行nvm install v7.8.0这将是默认节点版本,或者你可以安装任何版本的节点

例如,执行nvm install 10.14nvm use当前shell会话的该版本,但它将没有始终将其设置为您期望的未来会话的默认版本。您在新shell会话中获得的节点版本由nvm alias default确定。令人困惑的是,nvm install只会在尚未设置的情况下设置默认别名。要获得预期的行为,请执行以下操作:

nvm alias default ''; nvm install 10.14

这将确保下载该版本,将其用于当前会话将其设置为未来会话的默认值。

如果您也有SDKMAN…

不知何故,SDKMAN与我的NVM发生了冲突。如果你对此束手无策,仍然无法弄清楚,我只是通过忽略SDKMAN中的“这必须在文件末尾…”并将NVM行放在它之后来修复它。

#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!!
export SDKMAN_DIR="/Users/myname/.sdkman"
[[ -s "/Users/myname/.sdkman/bin/sdkman-init.sh" ]] && source "/Users/myname/.sdkman/bin/sdkman-init.sh"


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
$ nvm alias default {NODE_VERSION}

当我们使用上述命令时,只更新节点版本,但npm仍然使用旧版本。

这是更新nodenpm的另一种解决方案,在我的情况下,我想使用节点8.9.4,我使用了下面的命令。

$ nvm use default 8.9.4

该命令返回输出。

现在使用节点v8.9.4(npm v5.6.0)

我正在使用ZSH,所以我必须按顺序修改~/.zshrc与NVM有关的行:

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

我在VS Code编辑器中使用集成终端时遇到了同样的问题。使用nvm更改节点版本后重新启动VS Code为我解决了这个问题。

这里有一个简单的指令:

1)安装:

nvm install 8.10.0

2)每个终端使用一次

nvm use 8.10.0

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

nvm alias default 8.10.0

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

不要忘记查看NVM留档以获取更多信息。

另请注意,您可能需要为IDE指定节点版本: 输入图片描述

在Ubuntu上,如果您运行非交互式shell,例如从cronwork或init或upstart脚本运行,则存在潜在问题。

Ubuntu的默认.bashrc在顶部有这个守卫,如果shell是非交互式的,它会提前退出:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

因此,为了加载非交互式脚本的NVM,您可以编辑~/.bashrc并将NVM的init移动到文件顶部,就在守卫上方。

更安全的是复制 NVM初始化,这样它会出现两次。这将解决其他答案中提到的问题,当其他行在NVM之后修改PATH时。NVM似乎不介意运行两次,尽管它确实会稍微减慢shell启动速度。

在github的nvm自动加载脚本中,我不得不进行修改

local node_version="$(nvm version)"local node_version="$(node -v)"

在我的路径中,我的系统上有一个本地安装的nvm,所以nvm version一直说系统无论如何

  • 我将NVM与zsh bash一起使用
  • 点击此链接删除nvm
  • $ brew install nvm
  • 我在安装并重新启动终端后运行了这行$ source $(brew --prefix nvm)/nvm.sh
  • 将下面的行放在~/.zshrc文件中,也由NVM官方GitHub页面指示
export NVM_DIR="$HOME/.nvm"
[ -s "/usr/local/opt/nvm/nvm.sh" ] && . "/usr/local/opt/nvm/nvm.sh"  # This loads nvm
[ -s "/usr/local/opt/nvm/etc/bash_completion.d/nvm" ] && . "/usr/local/opt/nvm/etc/bash_completion.d/nvm"  # This loads nvm bash_completion


# place this after nvm initialization!
autoload -U add-zsh-hook


load-nvmrc() {
local node_version="$(nvm version)"
local nvmrc_path="$(nvm_find_nvmrc)"


if [ -n "$nvmrc_path" ]; then
local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")


if [ "$nvmrc_node_version" = "N/A" ]; then
nvm install
elif [ "$nvmrc_node_version" != "$node_version" ]; then
nvm use
fi
elif [ "$node_version" != "$(nvm version default)" ]; then
echo "Reverting to nvm default version"
nvm use default
fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc

出于某种原因,在我的. bashrc文件中,我发现了这个:

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

并且不得不删除--没用标志,我不记得首先放在那里…… 还有一件事要做

如代码库问题部分所述,nvm use只是shell的生命周期。我发现这非常有用,但有时当你处理需要不同版本代码的不同代码库时,它可能会给你带来麻烦。 这是GitHub中相关讨论的链接

这些解决方案在我的环境中都不起作用,nvm似乎总是加载第一个安装的节点版本,无论是什么(除非您通过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

新终端现在应该尊重默认版本。

1.-通过自制安装

2.-因为我使用zsh终端,在~/.zshrc中添加这几行,如果您使用bash,则需要将该行放在~/.bash_profile

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

出于某种原因,在我的~/.profile文件中,我发现正在选择节点的版本,覆盖了nvm的alias default命令

还有一件事要检查。

在我的最后,我不得不改变两个别名STABLE和DEFAULT

nvm alias stable {node_version}


nvm alias default {node_version}

Linux /ubuntu

如何解决这个你可以看到这里

nvm use并不意味着持久化-它只适用于shell的生命周期。

如果您希望在打开新shell时将其作为默认值,您可以执行nvm alias default node,或者您可以创建一个.nvmrc文件,该文件将优先于当前目录中的任何位置,向上到/https://github.com/nvm-sh/nvm/issues/658

终端