Come configurare la mia shell in modo che nvm use
venga eseguita automaticamente ogni volta che c'è un file .nvmrc nella directory e utilizzare l'ultima versione o una configurazione globale quando non c'è un file .nvmrc?
Come configurare la mia shell in modo che nvm use
venga eseguita automaticamente ogni volta che c'è un file .nvmrc nella directory e utilizzare l'ultima versione o una configurazione globale quando non c'è un file .nvmrc?
Risposte:
Se usi zsh (z shell):
Chiamare automaticamente "nvm use" in una directory con un file .nvmrc
Mettilo nella tua $ HOME / .zshrc per chiamare nvm use automaticamente ogni volta che entri in una directory che contiene un file .nvmrc con una stringa che dice a nvm quale nodo usare:
# 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
Maggiori informazioni: https://github.com/creationix/nvm#zsh
cd
, poiché viene eseguito ogni volta che cambi directory. Ho aggiunto [[ -a .nvmrc ]] || return
alla prima riga load-nvmrc (), e questo ne ha migliorato significativamente le prestazioni
.nvmrc
nelle directory principali e inoltre non tornerà alla node
versione predefinita quando cd
esci dalla directory del progetto.
Ottima risposta da @devius .
L'ho appena esteso in modo che possa tornare alla versione predefinita quando si lascia una directory con .nvmrc
un'altra senza di essa.
~/.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.
anche se il file .nvmrc ha 9.3
.
VERSION=$(cat .nvmrc); nvm use $VERSION
Ho appena scoperto il cambio di versione automatico per Node.js https://github.com/wbyoung/avn , puoi usarlo.
Puoi anche seguire questo thread https://github.com/creationix/nvm/issues/110
Questa risposta è presa dalla documentazione ufficiale di nvm .
Metti quanto segue alla fine del tuo $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'
Questo è un miglioramento rispetto a:
avn
)Questo alias cercherà "su" dalla directory corrente per rilevare un file .nvmrc
file. Se lo trova, passerà a quella versione; in caso contrario, utilizzerà la versione predefinita.
cd
non è qualcosa che potresti mai fare in grandi lotti, quindi non penso sia importante a meno che il ritardo non sia evidente a un essere umano.
Ho provato molte soluzioni per questo e niente ha funzionato come volevo, quindi ho scritto il mio:
Funzione ZSH per passare automaticamente alla versione corretta del nodo
Per quanto ne so, questo è l'unico che soddisfa tutti i seguenti criteri:
.nvmrc
(proprio come nvm use
);.nvmrc
formato valido ;.nvmrc
,default
se non c'è nessun .nvmrc
punto sull'albero;Ancora un'altra soluzione usando direnv . Direnv viene fornito con OS X e molte distribuzioni, quindi non è necessaria alcuna installazione.
Aggiungi queste due righe al tuo .zshenv o .bash_profile a seconda della shell che usi:
export NVM_DIR="$HOME/.nvm" # You probably have this line already
export NODE_VERSIONS="${NVM_DIR}/versions/node"
export NODE_VERSION_PREFIX="v"
Aggiungi un file .envrc alla radice del progetto con il contenuto
set -e
use node
Infine cd nella tua directory. (Non dimenticare di fonte .zshenv)
direnv ti chiederà di consentire il caricamento della configurazione. generedirenv allow
e voilà!
Nota che direnv non supporta costrutti fantasiosi come lts/*
in .nvrmc. Sul lato positivo, direnv supporta un sacco di runtime come node, php, go, pyhton, ruby ecc. Permettendoci di utilizzare un unico strumento per risolvere i problemi di percorso.
Estendendo la risposta di @Adriano P , proporrei questa versione che è meno generale (funziona solo se .nvmrc
è impostata su una radice del repository git ), ma funziona nei casi in cui si naviga altrove nel progetto rispetto alla sua radice:
_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
Uso questo framework di configurazione zsh chiamato Oh My Zsh. È un repository molto attivo con aggiornamenti regolari. Provalo e sono sicuro che lo adorerai. Oh, e ha la funzione automatica .nvmrc integrata, quindi è semplice come installare il pacchetto tramite npm!
Per qualcuno che sta ancora affrontando il problema di cui sopra, il file README per nvm
ha questa sezione che sarebbe utile
https://github.com/creationix/nvm#deeper-shell-integration
Personalmente preferisco modificare .bashrc
( https://github.com/creationix/nvm#automatically-call-nvm-use ) rispetto ad altre soluzioni.
bash
shell.