Как настроить мою оболочку так, чтобы nvm use
запускался автоматически каждый раз, когда в каталоге был файл .nvmrc, и использовать последнюю версию или глобальную конфигурацию, когда нет файла .nvmrc?
Запускать `nvm use` автоматически каждый раз, когда в каталоге находится файл .nvmrc
Ответ 1
Я только что узнал об автоматическом переходе версии для Node.js https://github.com/wbyoung/avn, вы можете использовать это.
Вы также можете следить за этой цепочкой https://github.com/creationix/nvm/issues/110
Ответ 2
Если вы используете zsh (z shell):
Вызов 'nvm use' автоматически в каталоге с файлом .nvmrc
Поместите это в ваш $ HOME/.zshrc для автоматического вызова nvm всякий раз, когда вы вводите каталог, содержащий файл .nvmrc со строкой, сообщающей 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" ]; 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
Дополнительная информация: https://github.com/creationix/nvm#zsh
Ответ 3
Если вы используете bash, вы можете добавить это в свой ~/.bashrc
файл:
enter_directory() {
if [[ $PWD == $PREV_PWD ]]; then
return
fi
PREV_PWD=$PWD
[[ -f ".nvmrc" ]] && nvm use
}
export PROMPT_COMMAND=enter_directory
Ответ 4
Отличный ответ от @devius.
Я только что расширил его, чтобы он мог вернуться к версии по умолчанию, оставляя каталог с .nvmrc
другим без него.
~/.bashrc
:
#
# Run 'nvm use' automatically every time there
# 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
Ответ 5
Этот ответ взят из официальной документации nvm.
Поместите следующее в конец вашего $HOME/.bashrc
:
find-up () {
path=$(pwd)
while [[ "$path" != "" && ! -e "$path/$1" ]]; do
path=${path%/*}
done
echo "$path"
}
cdnvm(){
cd "[email protected]";
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'
Это улучшение по сравнению с:
- @Gabo Esquivel ответ - потому что вам не придется переключаться на другой инструмент (
avn
) - Ответы @devius и @Adriano P, не относящиеся к ситуациям, когда вы находитесь в проекте
Этот псевдоним будет искать "вверх" из вашего текущего каталога, чтобы обнаружить файл .nvmrc
. Если он его найдет, он переключится на эту версию; если нет, он будет использовать версию по умолчанию.
Ответ 6
Продолжая ответ @Adriano P, я бы предложил эту версию, которая является менее общей (работает только в том случае, если для .nvmrc
репозитория git установлено значение .nvmrc
), но работает в тех случаях, когда мы перемещаемся в другое место проекта, а не в его корневой каталог:
_enter_dir() {
local git_root
git_root=$(git rev-parse --show-toplevel 2>/dev/null)
if [[ "$git_root" == "$PREV_PWD" ]]; then
return
elif [[ -n "$git_root" && -f "$git_root/.nvmrc" ]]; then
nvm use
NVM_DIRTY=1
elif [[ "$NVM_DIRTY" == 1 ]]; then
nvm use default
NVM_DIRTY=0
fi
PREV_PWD="$git_root"
}
export PROMPT_COMMAND=_enter_dir
#export PROMPT_COMMAND="$PROMPT_COMMAND;_enter_dir" # use this if PROMPT_COMMAND already defined
Ответ 7
Я использую эту конфигурацию Zsh под названием Oh My Zsh. Это очень активный репозиторий с регулярными обновлениями. Попробуйте, и я уверен, что вам понравится. О, и он имеет встроенную автоматическую функцию .nvmrc, так что это так же просто, как установка пакета через npm!
Ответ 8
Для тех, кто все еще сталкивается с вышеупомянутой проблемой, README для nvm
имеет этот раздел, который будет полезен https://github.com/creationix/nvm#deeper-shell-integration
Лично я предпочитаю редактировать .bashrc
(https://github.com/creationix/nvm#automatics-call-nvm-use) перед другими решениями.