web-dev-qa-db-fra.com

lance automatiquement `nvm use` chaque fois qu'il y a un fichier .nvmrc dans le répertoire

Comment configurer mon shell pour que nvm use s'exécute automatiquement chaque fois qu'un fichier .nvmrc se trouve dans le répertoire et utilise la dernière version ou une configuration globale lorsqu'il n'y a pas de fichier .nvmrc?

34
Gabo Esquivel

Je viens de découvrir le changement de version automatique pour Node.js https://github.com/wbyoung/avn , vous pouvez l'utiliser.

Vous pouvez également suivre ce fil de discussion https://github.com/creationix/nvm/issues/110

26
Gabo Esquivel

Si vous utilisez zsh (z Shell):

Appel de 'nvm use' automatiquement dans un répertoire contenant un fichier .nvmrc

Mettez ceci dans votre $ HOME/.zshrc pour appeler nvm use automatiquement chaque fois que vous entrez dans un répertoire contenant un fichier .nvmrc avec une chaîne indiquant à nvm le noeud à utiliser:

# 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

Plus d'infos: https://github.com/creationix/nvm#zsh

25
Rotareti

Si vous utilisez bash vous pouvez ajouter ceci à votre fichier ~/.bashrc:

enter_directory() {
  if [[ $PWD == $PREV_PWD ]]; then
    return
  fi

  PREV_PWD=$PWD
  [[ -f ".nvmrc" ]] && nvm use
}

export Prompt_COMMAND=enter_directory
16
devius

Excellente réponse de @devius .

Je viens de l'étendre pour qu'il puisse revenir à la version par défaut lorsque vous laissez un répertoire avec .nvmrc dans un autre sans ce répertoire.

~/.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
11
Adriano P

Cette réponse est extraite de la documentation official nvm.

Placez les éléments suivants à la fin de votre $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'

C'est une amélioration par rapport à:

Cet alias rechercherait "up" dans votre répertoire actuel afin de détecter un fichier .nvmrc. S'il le trouve, il basculera vers cette version. sinon, il utilisera la version par défaut.

1
d4nyll

J'utilise ce cadre de configuration zsh appelé Oh My Zsh. C'est un référentiel très actif avec des mises à jour régulières. Essayez-le et je suis sûr que vous allez l'adorer. Oh, et il a la fonctionnalité automatique .nvmrc intégrée, donc c'est aussi simple que d'installer le paquet via npm!

https://github.com/robbyrussell/oh-my-zsh

0
Satya Sampathirao

Pour les personnes toujours confrontées au problème ci-dessus, le README pour nvm contient cette section qui serait utile https://github.com/creationix/nvm#deeper-Shell-integration }

Personnellement, je préfère éditer le .bashrc ( https://github.com/creationix/nvm#automatically-call-nvm-use } _) par rapport aux autres solutions. 

0
Dhruv Parmar

Étendant sur @Adriano P answer, je proposerais cette version moins générale (ne fonctionne que si .nvmrc est défini sur une racine de référentiel git), mais fonctionne dans les cas où nous naviguons ailleurs dans le projet. que sa racine:

_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
0
laur