如何配置我的shell,以便每当目录上有.nvmrc文件时nvm use
自动运行,并且在没有.nvmrc文件时使用最新版本或全局配置?
答案 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
答案 1 :(得分:26)
我刚刚发现了Node.js https://github.com/wbyoung/avn的自动版本切换,您可以使用它。
答案 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'
这是对以下内容的改进:
avn
)此别名将从当前目录中搜索“ 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安装软件包一样简单!
答案 10 :(得分:0)
对于仍面临上述问题的人,nvm
的自述文件具有此部分,将对您有所帮助
https://github.com/creationix/nvm#deeper-shell-integration
相对于其他解决方案,我个人更喜欢编辑.bashrc
(https://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
; 答案 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