如何在 "oh my zsh" 中运行 "nvm"?

115

系统中有一个通过 nvm 安装的 nodejs。命令不能运行 npm。 控制台是 Oh my zsh


使用 zsh-nvm 插件以便在 oh-my-zsh 中管理 Node.js 版本。 - Yossarian42
9个回答

183
你可以使用zsh-nvm或者在你的~/.zshrc文件中添加以下行来启用它。
 export NVM_DIR=~/.nvm
 [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"

额外信息:

为了更快的 shell 初始化,我使用 lazynvm,它只在需要时加载 Node。

lazynvm() {
  unset -f nvm node npm
  export NVM_DIR=~/.nvm
  [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm
}

nvm() {
  lazynvm 
  nvm $@
}

node() {
  lazynvm
  node $@
}

npm() {
  lazynvm
  npm $@
}

参考资料: 懒加载nvm以加快shell启动速度


1
如果有人在使用 Vim 进行开发,懒加载会导致使用 tsserver 的自动完成失败,因为 tsserver 在 PATH 中找不到。在我看来最好还是使用急切加载。 - geoyws
如果我将这个添加到~/.zshrc中,运行nvm时会出现“command not found”的错误?我该如何使用它? - Petrus Theron
请确保您的.zshrc已加载:您可以键入“lazy”,然后按Tab键,查看ZSH自动完成是否显示lazynvm。如果没有,请检查您的shell配置或ZSH配置,以确保它正在加载“.zshrc”。 - Ryan Wu
如果使用oh-my-zsh,nvm插件已经实现了延迟加载,因此请跳到下一个答案。 - javs
对于任何想知道 [ -s "$NVM_DIR/nvm.sh" ] 的人 => -s FILE - 如果FILE存在且大小不为零,则为真 - Kellen Stuart

182

从Bash切换到Oh-My-Zsh

如果你已经安装了nvm并且要从bash切换到oh-my-zsh,你可以简单地打开.zshrc文件,并添加内置于oh-my-zsh中的nvm插件:

  1. 使用以下命令在nano中打开您的zsh配置文件.zshrc: nano ~/.zshrc
  2. 滚动到显示plugins=(git)的位置,并在括号中添加nvm,以使其显示为plugins=(git nvm)(用空格分隔插件)
  3. 按下control + O(在macOS上),然后按enter保存,然后按control + X退出
  4. 然后打开一个新的终端窗口/标签,并输入nvm ls以确认它是否有效。请注意,您必须打开一个新的窗口/标签才能使shell使用新更新的.zshrc配置文件(或输入source ~/.zshrc等)。

来源:https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/nvm


1
感谢您提供详细的答案。我认为改进此答案的唯一方法是:添加一个标题(从 Bash 移动到 zsh)并添加一些换行符。 - duichwer
1
感谢 @duichwer 的建议。我刚刚进行了那些编辑。 - Spencer
1
这是正确且恰当的答案,请忽略其他的哈哈。 - geoyws
你是一个救星。 - Zameer Fouzan
当打开一个新的终端标签页时,nvm ls命令无法工作,这是怎么回事? - undefined
显示剩余2条评论

41
这对我在Ubuntu 20.04上有效。
安装或更新nvm。
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash

在终端中运行以下命令,将其添加到您的 ~/.zshrc 文件中。
echo 'export NVM_DIR=~/.nvm' >> ~/.zshrc
echo '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"' >> ~/.zshrc

在当前的shell环境中加载
source ~/.zshrc

检查 nvm 版本
nvm -v

20

使用 Homebrew 安装 nvm

  1. brew install nvm

  2. 编辑您的系统配置

    vim ~/.zshrc     # or  vim ~/.bashrc
    export NVM_DIR=~/.nvm

保存文件:按下 esc 键,然后输入 :wq

  1. 重新加载配置:
    source $(brew --prefix nvm)/nvm.sh

  2. 查看 nvm 版本

$ nvm --version
# 0.36.0

享受它。


3
对我来说,“source $(brew --prefix nvm)/nvm.sh”是我所缺失的那一部分。谢谢! - Aurelio
谢谢,这解决了我的问题。很高兴在重新安装之前尝试了这个方法。 - yoges nsamy
":wq" 是什么意思? - MehmedB

17
一个更简单的解决方案是使用默认提供的 nvm 插件 :

它还会自动源代码 nvm,所以您不需要在 .zshrc 文件中手动添加。

  1. git clone https://github.com/nvm-sh/nvm.git ~/.nvm
  2. cd ~/.nvm && git checkout v0.35.1(当前最新的 版本)
  3. nvm 添加到您的~/.zshrc文件中。例如:plugins=(... nvm)

这真的帮了我很多。谢谢。 - Yunus Emre

11

我发现oh-my-zsh自带一个nvm插件(不同于lukechilds的插件)。经过简短检查,我认为在加载时它会添加必要的修改到.zshrc,因此只需将nvm添加到.zshrc中的插件列表中应该也能工作(对我来说确实起作用了)。

通过谷歌搜索,我没有找到更多有关这个默认nvm插件的详细信息,所以我不知道这是否是“必须”解决方案。


1
截至目前,将nvm添加为插件在我的Mac上无法工作(尽管操作系统不应该是一个因素)。我仍然收到zsh:command not found:nvm。我会尝试手动添加。 - Mike S.
我遇到了同样的问题。请问您所说的“手动添加”是什么意思? - yoges nsamy
为了让zsh-nvm正常工作,我必须找到README中的章节如何安装插件。步骤包括:git clone https://github.com/lukechilds/zsh-nvm ~/.oh-my-zsh/custom/plugins/zsh-nvm,然后我必须编辑~/.zshrc文件并添加插件plugins=( git zsh-nvm )。重新打开终端,最终成功运行nvm list - Dave Boster

8
使用Linux(Ubuntu 20.04、22.04、22.10和23.04)。
使用您喜欢的编辑器,编辑~/.zshrc文件。
nano or vi ~/.zshrc

在文件的末尾,你要加上:

# NVM
export NVM_DIR=~/.nvm
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"

然后你跑起来:
source ~/.zshrc

7
将以下代码添加到您的用户目录下的 .zshrc 文件中。
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

然后在您的终端上运行此代码:

source ~/.zshrc

2
我强烈建议使用christophemarois的方法来懒加载nvm(node,npm和全局包),以避免缓慢的shell启动时间。
# Add every binary that requires nvm, npm or node to run to an array of node globals
NODE_GLOBALS=(`find ~/.nvm/versions/node -maxdepth 3 -type l -wholename '*/bin/*' | xargs -n1 basename | sort | uniq`)
NODE_GLOBALS+=("node")
NODE_GLOBALS+=("nvm")

# Lazy-loading nvm + npm on node globals call
load_nvm () {
  export NVM_DIR=~/.nvm
  [ -s "$(brew --prefix nvm)/nvm.sh" ] && . "$(brew --prefix nvm)/nvm.sh"
}

# Making node global trigger the lazy loading
for cmd in "${NODE_GLOBALS[@]}"; do
  eval "${cmd}(){ unset -f ${NODE_GLOBALS}; load_nvm; ${cmd} \$@ }"
done

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