【问题标题】:nvm keeps "forgetting" node in new terminal sessionnvm 在新的终端会话中保持“忘记”节点
【发布时间】:2014-08-26 10:33:59
【问题描述】:

在 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

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

【问题讨论】:

  • 只想在此处添加 - 确保您从 .bash_profile 导出而不是您的 .bashrc
  • Mac OS 上的 .bash_profile 与 .bashrc 有什么区别?

标签: node.js macos npm homebrew nvm


【解决方案1】:

试试nvm alias default。例如:

$ nvm alias default 0.12.7

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

【讨论】:

  • 对我不起作用,而且我没有遇到麦克斯韦状态的问题。我没有使用 brew,但我升级/重新安装了我的 nvm 并修复了它。
  • 如果这不起作用,请确保在您的.bash_profile(或.bashrc 或其他)中,您在PATH 之后没有任何修改PATHsource xx/nvm.sh
  • @KellyS.French(这里是 nvm 维护者)nvm 还没有达到 1.0 - 你可能已经从 npm 安装了它。仅使用 nvm.sh 的 curl 脚本安装,您将获得正确的版本。
  • @KellyS.French 啊! nvm 不支持 windows(BashOnWindows 除外)- 你可能有 nvm-windows,这是一个不同的项目。
  • 您也可以在nvm的后续版本中指定lts版本。例如:nvm alias default lts/boron
【解决方案2】:

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

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

【讨论】:

  • 我如何检查这个?我怀疑是这种情况。
  • 这是我的情况,谢谢!我将导出设置在我的 .zshrc 文件的顶部,只需将其移至底部即可解决问题
  • 那是我的情况。解决方案是将 NVM ~/.bash_profile 条目移动到文件末尾 + 将 nvm alias defaultnvm use 设置为我需要的版本。
  • 这就是我的解决方案。将以下内容移至.bashrc 的底部:export NVM_DIR="$HOME/.nvm" 然后. "/usr/local/opt/nvm/nvm.sh"
【解决方案3】:

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

nvm alias default node

【讨论】:

  • 这实际上比别名为特定版本更好(另一个答案)。这也是github.com/creationix/nvm#install-script 建议的方法。
  • 如果设置默认别名不起作用,1.尝试将 bash 配置文件中的 export NVM_DIR=.... 移动到最后 2.如果这也不起作用,请卸载 nvm 并重新安装它并安装您的节点版本不要花太多时间寻找修复。重新安装非常快
【解决方案4】:

评价最高的解决方案似乎对我不起作用。我的解决方案如下:

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

    mkdir ~/.nvm cp $(brew --prefix nvm)/nvm-exec ~/.nvm/ 导出 NVM_DIR=~/.nvm 源 $(brew --prefix nvm)/nvm.sh

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

【讨论】:

    【解决方案5】:

    这个问题已经提到了 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
    

    descriptive solution link

    【讨论】:

    • 请注意,这依赖于在设置遥控器时在版本中包含v。例如。 v4.2.4 而不是 4.2.4
    【解决方案6】:

    在安装任何版本后运行它,

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

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

    【讨论】:

    • 我建议在该命令中使用&amp;&amp;s 而不是;s。如果 which 找不到节点,我们不想继续 chmod /bin/*
    【解决方案7】:

    要安装最新的稳定版本:

    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 的建议可以帮助用户直观地看到他们的版本控制发生了什么。谢谢!
    【解决方案8】:

    如果您在 nvm 之前安装了 node,请检查您的 ~/.bash_profile 是否没有类似的内容:

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

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

    【讨论】:

    • 设置路径变量与nvm版本选择无关吧?
    • nvm.sh 应该在您设置它之后修改您的 PATH (例如,使用上述)。这让 nvm 将其版本目录 before /usr/local/bin 放置在节点的“系统”版本所在的位置。
    【解决方案9】:

    就我而言,另一个程序已将PATH 更改为.bashrc

    如果其他程序在 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 中的一个错误,但我可能弄错了。)

    【讨论】:

    • 这对我有帮助!默认卡住了。
    • 给这家伙一枚勋章!在 NVM_DIR 导出后,我在 zshrc 中额外加载了其他 *rc 文件,这让我发疯。谢谢!
    • 谢谢!这让我发疯了。
    • 请说明为什么在导出语句后没有使用“source ~/.nvm/nvm.sh”?
    • @vikramvi 我们在最后一行做了。 \.source 相同。 [ -s ... ] 只是检查文件是否存在且不为空。如果您问为什么不将源代码行移到底部,并将 export NVM_DIR 留在原来的位置,唯一的原因是为了清晰起见,将 NVM 行保持在一起。如果您愿意,可以将它们分开。
    【解决方案10】:

    我在这里找到了一条新路。使用 n Interactively Manage Your Node.js 会有所帮助。

    【讨论】:

    • 是的!不确定是不是因为我正在使用fish shell,但接受的答案对我不起作用。 n 是一种享受!
    【解决方案11】:

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

    1 -> 卸载 NVM

    rm -rf ~/.nvm
    

    2 -> 按照this 删除 npm 依赖项

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

    【讨论】:

    • 非常感谢!这是唯一在 bash 中设置节点路径并为我工作的解决方案。我只是使用“nvm install node”来安装最新的节点版本,而不是使用“nvm install v7.8.0”
    • 我认为您不需要通过 4 中的sudo 提升权限。我将编辑要删除的答案,因为这里的特权升级似乎没有任何好处,因为答案在主目录中有效。如果不是这样,我很想知道为什么——谢谢!
    【解决方案12】:

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

    nvm alias default ''; nvm install 10.14
    

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

    【讨论】:

      【解决方案13】:

      如果你也有 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
      

      【讨论】:

        【解决方案14】:
        $ nvm alias default {NODE_VERSION}
        

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

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

        $ nvm use default 8.9.4
        

        命令返回输出。

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

        【讨论】:

          【解决方案15】:

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

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

          【讨论】:

          • 谢谢。如果有人在 ZSH 上遇到问题,这个解决方案是最简单的。
          【解决方案16】:

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

          【讨论】:

            【解决方案17】:

            这里有一个简单的说明:

            1) 安装:

            nvm install 8.10.0
            

            2) 每个终端使用一次

            nvm use 8.10.0
            

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

            nvm alias default 8.10.0
            

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

            别忘了查看nvm documentation 了解更多信息。

            另请注意,您可能需要为 IDE 指定节点版本:

            【讨论】:

            • 谢谢@arseniy
            【解决方案18】:

            在 Ubuntu 上,如果您正在运行非交互式 shell,例如从 cronjob、init 或 upstart 脚本运行,则可能会出现问题。

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

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

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

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

            【讨论】:

              【解决方案19】:

              在来自 github 的 nvm 自动加载脚本中,我不得不更改

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

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

              【讨论】:

                【解决方案20】:
                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
                

                【讨论】:

                  【解决方案21】:

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

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

                  并且不得不删除 --no-use 标志,我不记得把它放在首位... 只是另一件事要检查。

                  【讨论】:

                    【解决方案22】:

                    正如存储库的问题部分所述,nvm use 仅适用于 shell 的整个生命周期。我发现这非常有用,但有时当您处理需要不同版本代码的不同代码库时,它实际上可能会给您带来麻烦。 这是GitHub中相关讨论的link

                    【讨论】:

                      【解决方案23】:

                      这些解决方案在我的环境中都不起作用,无论如何,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
                      

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

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2018-03-22
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2016-01-08
                        • 2015-08-11
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多