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?
javascript
node.js
shell
nvm
Gabo Esquivel
fonte
fonte
bash
shell.Respostas:
Se você usar zsh (z shell):
# 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
fonte
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.Se você usar o bash, poderá adicionar isto ao seu
~/.bashrc
arquivo:enter_directory() { if [[ $PWD == $PREV_PWD ]]; then return fi PREV_PWD=$PWD [[ -f ".nvmrc" ]] && nvm use } export PROMPT_COMMAND=enter_directory
fonte
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
fonte
node v.0.0 (64-bit) is not installed.
, embora o arquivo .nvmrc tenha9.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
fonte
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.fonte
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 comonvm use
);.nvmrc
formato válido ;.nvmrc
,default
se não houver nenhum.nvmrc
lugar no topo da árvore;fonte
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.fonte
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
fonte
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!
https://github.com/robbyrussell/oh-my-zsh
fonte
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-integrationPessoalmente, prefiro editar o
.bashrc
( https://github.com/creationix/nvm#automatically-call-nvm-use ) a outras soluções.fonte