每次目录上有.nvmrc文件时自动运行`nvm use`

时间:2014-05-09 03:56:29

标签: javascript node.js shell nvm

如何配置我的shell,以便每当目录上有.nvmrc文件时nvm use自动运行,并且在没有.nvmrc文件时使用最新版本或全局配置?

13 个答案:

答案 0 :(得分:32)

如果您使用 zsh (z shell):

  

致电&nvm使用'自动在具有.nvmrc文件的目录中

     

将此项放入$ HOME / .zshrc,以便在输入包含.nvmrc文件的目录时自动调用nvm,该文件的字符串告诉nvm要使用的节点:

# 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" ] && [ "$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

更多信息:https://github.com/creationix/nvm#zsh

答案 1 :(得分:26)

我刚刚发现了Node.js https://github.com/wbyoung/avn的自动版本切换,您可以使用它。

您也可以关注此主题 https://github.com/creationix/nvm/issues/110

答案 2 :(得分:18)

如果您使用 bash ,可以将其添加到~/.bashrc文件中:

enter_directory() {
  if [[ $PWD == $PREV_PWD ]]; then
    return
  fi

  PREV_PWD=$PWD
  [[ -f ".nvmrc" ]] && nvm use
}

export PROMPT_COMMAND=enter_directory

答案 3 :(得分:14)

来自@devius的优秀答案。

我只是对它进行了扩展,以便在没有它的情况下将.nvmrc的目录留给另一个目录时可以恢复为默认版本。

~/.bashrc

#
# Run 'nvm use' automatically every time there's 
# a .nvmrc file in the directory. Also, revert to default 
# version when entering a directory without .nvmrc
#
enter_directory() {
if [[ $PWD == $PREV_PWD ]]; then
    return
fi

PREV_PWD=$PWD
if [[ -f ".nvmrc" ]]; then
    nvm use
    NVM_DIRTY=true
elif [[ $NVM_DIRTY = true ]]; then
    nvm use default
    NVM_DIRTY=false
fi
}

export PROMPT_COMMAND=enter_directory

答案 4 :(得分:2)

此答案来自official nvm documentation

$HOME/.bashrc的末尾放置以下内容:

find-up () {
    path=$(pwd)
    while [[ "$path" != "" && ! -e "$path/$1" ]]; do
        path=${path%/*}
    done
    echo "$path"
}

cdnvm(){
    cd "$@";
    nvm_path=$(find-up .nvmrc | tr -d '[:space:]')

    # If there are no .nvmrc file, use the default nvm version
    if [[ ! $nvm_path = *[^[:space:]]* ]]; then

        declare default_version;
        default_version=$(nvm version default);

        # If there is no default version, set it to `node`
        # This will use the latest version on your machine
        if [[ $default_version == "N/A" ]]; then
            nvm alias default node;
            default_version=$(nvm version default);
        fi

        # If the current version is not the default version, set it to use the default version
        if [[ $(nvm current) != "$default_version" ]]; then
            nvm use default;
        fi

        elif [[ -s $nvm_path/.nvmrc && -r $nvm_path/.nvmrc ]]; then
        declare nvm_version
        nvm_version=$(<"$nvm_path"/.nvmrc)

        # Add the `v` suffix if it does not exists in the .nvmrc file
        if [[ $nvm_version != v* ]]; then
            nvm_version="v""$nvm_version"
        fi

        # If it is not already installed, install it
        if [[ $(nvm ls "$nvm_version" | tr -d '[:space:]') == "N/A" ]]; then
            nvm install "$nvm_version";
        fi

        if [[ $(nvm current) != "$nvm_version" ]]; then
            nvm use "$nvm_version";
        fi
    fi
}
alias cd='cdnvm'

这是对以下内容的改进:

此别名将从当前目录中搜索“ up”,以检测.nvmrc文件。如果找到它,它将切换到该版本。如果没有,它将使用默认版本。

答案 5 :(得分:1)

还有另一个使用direnv的解决方案。 Direnv带有OS X和许多发行版,因此无需安装。

根据所使用的shell,将这两行添加到.zshenv或​​.bash_profile中:


export NVM_DIR="$HOME/.nvm" # You probably have this line already
export NODE_VERSIONS="${NVM_DIR}/versions/node"
export NODE_VERSION_PREFIX="v"

将.envrc文件及其内容添加到项目根目录

set -e
use node

最后进入您的目录。 (不要忘了.zshenv的来源)

direnv会要求您允许加载配置。 输入direnv allow,然后瞧瞧!

请注意,direnv不支持.nvrmc中类似lts/*的奇特构造。从积极的方面来看,direnv支持一堆运行时,例如node,php,go,pyhton,ruby等。这使我们能够使用单个工具来解决路径问题。

答案 6 :(得分:1)

如果你使用 zsh (z shell):

我以更快的不同方式加载 nvm,但这意味着 nvm_find_nvmrc 不可用,因此 @Rotareti 解决方案对我不起作用。

我找到了任何简单的修复方法:只需调用不带参数的 nvm use,因为它本身已经处理了查找 .nvmrc 文件的逻辑,如果找不到,则使用默认版本。

# ~/.zshrc

# DEFAULT NVM CONFIG
#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

# Add the following lines before all other OH MY ZSH config
# FASTER WAY TO CONFIGURE NVM ON STARTUP - OTHERWISE IT'S REALLY SLOW
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"
export PATH="$NVM_DIR/versions/node/v$(<$NVM_DIR/alias/default)/bin:$PATH"
alias nvm="unalias nvm; [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"; nvm $@"

# USE NVM VERSION IF .NVMRC FOUND, OTHERWISE USE DEFAULT
nvm use &>/dev/null

总而言之,我发现这是一个非常快速的解决方案,让我省去了输入 nvm use 的痛苦。

当没有可用的 nvm use 文件时,我想避免使用 .nvmrc,但是我的计算机上的加载时间很短,而且我很少需要没有 Node 的终端 - 所以这适用于我现在。

更新:添加了关于放置建议脚本的位置的说明

答案 7 :(得分:1)

Bash 版本(放入 $HOME/.bashrc),具有以下功能:

  • 不使用 cd 别名(它允许以其他方式更改目录,例如直接在另一个目录中启动终端)
  • 在上层目录 (.nvmrc) 中查找 using nvm_find_nvmrc
  • 如果不需要,则不调用 nvm use
call_nvm_use_if_needed() {
  NEW_NVMRC="$(nvm_find_nvmrc)"
  if [[ "$NEW_NVMRC" != "$CURRENT_NVMRC" ]]; then
    if [[ -z "$NEW_NVMRC" ]]; then
      nvm use default
    else
      nvm use
    fi
    CURRENT_NVMRC="$NEW_NVMRC"
  fi
}

PROMPT_COMMAND="call_nvm_use_if_needed; ${PROMPT_COMMAND}"

答案 8 :(得分:0)

@Adriano P答案的基础上,我建议使用此版本,该版本的通用性较低(仅在{em> git 存储库根目录上设置set filePath to (path to desktop as text) & "test.jpg" tell application "Adobe Acrobat Pro" save active doc to filePath using conversion "com.adobe.acrobat.jpeg" end tell 时有效)当我们导航到项目中除根目录之外的其他地方的情况:

.nvmrc

答案 9 :(得分:0)

我使用称为Oh My Zsh的zsh配置框架。这是一个非常活跃的存储库,具有定期更新。试试吧,我相信您会喜欢的。哦,它内置了自动的.nvmrc功能,就像通过npm安装软件包一样简单!

https://github.com/robbyrussell/oh-my-zsh

答案 10 :(得分:0)

对于仍面临上述问题的人,nvm的自述文件具有此部分,将对您有所帮助 https://github.com/creationix/nvm#deeper-shell-integration

相对于其他解决方案,我个人更喜欢编辑.bashrchttps://github.com/creationix/nvm#automatically-call-nvm-use)。

答案 11 :(得分:0)

我为此尝试了许多解决方案,但没有达到我想要的方式,所以我写了自己的:

ZSH function to auto-switch to correct Node version

据我所知,这是唯一符合以下所有条件的一个:

  • 通过搜索目录树以找到最接近的.nvmrc(就像nvm use一样,确保您始终使用正确的版本;
  • 可以处理任何有效的.nvmrc格式;
  • 如果没有安装的版本满足.nvmrc,则明确警告您,
  • 如果树上没有default,则假设您要.nvmrc
  • 完全安静且快速,如果您已经安装了正确的Node版本。

答案 12 :(得分:0)

对于 zsh 用户,您应该尝试zsh-nvm

<块引用>

用于安装、更新和加载 nvm 的 Zsh 插件

假设您正在使用抗原,您可以像这样打开自动使用:

export NVM_AUTO_USE=true
antigen bundle lukechilds/zsh-nvm

zsh-nvm 还支持 lazy load nvm,,大大减少了 zsh 的启动时间

% time (source "$NVM_DIR/nvm.sh")
( source "$NVM_DIR/nvm.sh"; )  0.58s user 0.37s system 109% cpu 0.874 total

% time (_zsh_nvm_lazy_load)
( _zsh_nvm_lazy_load; )  0.01s user 0.01s system 168% cpu 0.012 total