Como configurar meu shell para que seja nvm use
executado automaticamente sempre que houver um arquivo .nvmrc no diretório e use a versão mais recente ou uma configuração global quando não houver um arquivo .nvmrc?
Como configurar meu shell para que seja nvm use
executado automaticamente sempre que houver um arquivo .nvmrc no diretório e use a versão mais recente ou uma configuração global quando não houver um arquivo .nvmrc?
Respostas:
Se você usar zsh (z shell):
Chamar 'nvm use' automaticamente em um diretório com um arquivo .nvmrc
Coloque isso em seu $ HOME / .zshrc para chamar o nvm, use automaticamente sempre que você entrar em um diretório que contém um arquivo .nvmrc com uma string informando ao nvm qual nó usar:
# 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
Mais informações: https://github.com/creationix/nvm#zsh
cd
, uma vez que é executado toda vez que você muda de diretório. Eu adicionei [[ -a .nvmrc ]] || return
à primeira linha de load-nvmrc (), e isso melhorou significativamente o desempenho dele
.nvmrc
nos diretórios pais e também não volta à node
versão padrão quando você cd
sai do diretório do projeto.
Excelente resposta de @devius .
Acabei de estendê-lo para que possa reverter para a versão padrão ao sair de um diretório .nvmrc
para outro sem ele.
~/.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
node v.0.0 (64-bit) is not installed.
, embora o arquivo .nvmrc tenha 9.3
.
VERSION=$(cat .nvmrc); nvm use $VERSION
Acabei de descobrir sobre a troca automática de versão para Node.js https://github.com/wbyoung/avn , você pode usar isso.
Você também pode seguir este tópico https://github.com/creationix/nvm/issues/110
Esta resposta foi retirada da documentação oficial do nvm .
Coloque o seguinte no final de $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'
Esta é uma melhoria em relação a:
avn
)Este apelido pesquisaria 'up' em seu diretório atual para detectar um .nvmrc
arquivo. Se o encontrar, ele mudará para essa versão; caso contrário, ele usará a versão padrão.
cd
não é algo que você provavelmente fará em grandes lotes, então não acho que isso importe, a menos que o atraso seja perceptível para um humano.
Tentei muitas soluções para isso e nada funcionou da maneira que eu queria, então escrevi o meu próprio:
Função ZSH para alternar automaticamente para a versão correta do Node
Pelo que eu sei, este é o único que atende a todos os seguintes critérios:
.nvmrc
(assim como nvm use
);.nvmrc
formato válido ;.nvmrc
,default
se não houver nenhum .nvmrc
lugar no topo da árvore;Mais uma solução usando direnv . O Direnv vem com o OS X e muitas distros, portanto nenhuma instalação é necessária.
Adicione essas duas linhas ao seu .zshenv ou .bash_profile, dependendo de qual shell você usa:
export NVM_DIR="$HOME/.nvm" # You probably have this line already
export NODE_VERSIONS="${NVM_DIR}/versions/node"
export NODE_VERSION_PREFIX="v"
Adicione um arquivo .envrc à raiz do projeto com o conteúdo
set -e
use node
Finalmente cd para o seu diretório. (Não se esqueça de fonte .zshenv)
direnv irá pedir-lhe para permitir a configuração de carregamento. Digite direnv allow
e voila!
Observe que direnv não suporta construções extravagantes como lts/*
em .nvrmc. Do lado positivo, direnv suporta vários tempos de execução como node, php, go, pyhton, ruby etc., permitindo-nos usar uma única ferramenta para resolver problemas de caminho.
Estendendo a resposta @Adriano P , eu proporia esta versão que é menos geral (só funciona se .nvmrc
for definida em uma raiz de repositório git ), mas funciona nos casos em que navegamos para outro lugar no projeto que não sua raiz:
_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
Eu uso esta estrutura de configuração zsh chamada Oh My Zsh. É um repositório muito ativo com atualizações regulares. Experimente e tenho certeza que você vai adorar. Ah, e tem o recurso automático .nvmrc integrado, então é tão simples quanto instalar o pacote através do npm!
Para alguém que ainda enfrenta o problema acima, o README de nvm
tem esta seção que seria útil
https://github.com/creationix/nvm#deeper-shell-integration
Pessoalmente, prefiro editar o .bashrc
( https://github.com/creationix/nvm#automatically-call-nvm-use ) a outras soluções.
bash
shell.