ディレクトリに.nvmrcファイルがあるたびに `nvmuse`を自動的に実行します


88

nvm useディレクトリに.nvmrcファイルがあるたびに自動的に実行され、.nvmrcファイルがない場合は最新バージョンまたはグローバル構成を使用するようにシェルを構成するにはどうすればよいですか?


2
このユースケースは、Deep ShellIntegration公式nvmドキュメントに記載されています。あなたも見ることができます私の答えのためのシェルを。bash
d4nyll

回答:


89

zsh(zシェル)を使用する場合:

.nvmrcファイルのあるディレクトリで「nvmuse」を自動的に呼び出す

これを$ HOME / .zshrcに入れて、使用するノードをnvmに指示する文字列を含む.nvmrcファイルを含むディレクトリに入るたびに、nvmuseを自動的に呼び出すようにします。

# 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


6
これは私にとっては本当にうまくいきましたが、cdディレクトリを変更するたびに実行されるため、パフォーマンスが低下しました。私は、追加[[ -a .nvmrc ]] || return負荷nvmrc()の最初の行に、それが大幅にそれの性能向上
Belgabad

1
@Belgabadこの行では、スクリプトが.nvmrc親ディレクトリをチェックせず、プロジェクトディレクトリから出たnodeときにデフォルトバージョンに戻らないため、パフォーマンスが向上しますcd
ロタレティ

50

bashを使用する場合は、これを~/.bashrcファイルに追加できます。

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

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

export PROMPT_COMMAND=enter_directory

33

@deviusからの素晴らしい答え。

ディレクトリ.nvmrcを別のディレクトリに残したときにデフォルトバージョンに戻せるように拡張しました。

~/.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

Windowsでbashを使用するとnode v.0.0 (64-bit) is not installed.、.nvmrcファイルに9.3。が含まれている場合でもこれが返されます。
hofnarwillie 2018年

2
を使用して修正VERSION=$(cat .nvmrc); nvm use $VERSION
hofnarwillie 2018年

また、まったく別の獣であるnvm-for-windowsを使用しているとも言えます。しかし、上記のスクリプトと変更を加えると、それは扱います。+1
hofnarwillie 2018年

26

Node.jsの自動バージョン切り替えについて知りましたhttps://github.com/wbyoung/avn、それを使用できます。

このスレッドをフォローすることもできます https://github.com/creationix/nvm/issues/110


32
これは気のめいるようです..ツールスタックの深さに制限はありませんか?node→npm→nvm→avn、そしてバックアップします。ため息つく私はボールをプレーしますが、私の情熱はハックするたびに衰えています。(そしてもちろん、リンクに感謝します。)
hraban 2017

言及されたスレッドのコメントはどれも私にとってbashでは機能しませんでした。多分それらはすべてMacOS用です。Ubuntuで動作するものについては、以下の私の答えを確認してください。
devius

15

この回答は、公式のnvmドキュメントから取得されます

あなたの最後に以下を入れてください$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'

これは以下の改善です。

このエイリアスは、.nvmrcファイルを検出するために、現在のディレクトリから「上」を検索します。見つかった場合は、そのバージョンに切り替わります。そうでない場合は、デフォルトバージョンが使用されます。


少し遅い表示されますが、私は本当にこのオプションのような
BossmanT

@BossmanT「少し遅いように見える」とは、それが何をしているのかを見て遅いと思うのか、それとも実際に実行が遅いと思ったのか。
カルム

@callum唯一の私のbash環境で実行されていることを観察するから、何のタイムトライアルはもちろん、その低速の第二の割合について、何もありませんが、重要な、しかしそれに立候補しなかった
BossmanT

ラグは検出できませんでした。ランニングcdは、大規模なバッチで行う可能性が高いことではないので、人間がラグに気付かない限り、それは重要ではないと思います。
カルム

3

私はこれに対して多くの解決策を試しましたが、私が望むように何も機能しなかったので、私は自分自身を書きました:

正しいノードバージョンに自動切り替えするZSH機能

私の知る限り、これは次のすべての基準を満たす唯一のものです。

  • ディレクトリツリーを検索して最も近いものを見つけることにより、常に正しいバージョンであることが保証されます.nvmrc(のようにnvm use)。
  • 任意の有効な.nvmrc形式を処理できます。
  • インストールされているバージョンが満たしていない場合は.nvmrc、明確に警告します。
  • ツリーの上default.nvmrcどこにも存在しない場合は、必要であると想定します。
  • すでに正しいノードバージョンを使用している場合は、完全にサイレントで高速です。

1

direnvを使用したさらに別のソリューション。DirenvにはOSXと多くのディストリビューションが付属しているため、インストールは必要ありません。

使用するシェルに応じて、次の2行を.zshenvまたは.bash_profileに追加します。


export NVM_DIR="$HOME/.nvm" # You probably have this line already
export NODE_VERSIONS="${NVM_DIR}/versions/node"
export NODE_VERSION_PREFIX="v"

内容を含む.envrcファイルをプロジェクトルートに追加します

set -e
use node

最後に、ディレクトリにcdします。(.zshenvをソースすることを忘れないでください)

direnvは、ロード構成を許可するように要求します。タイプdirenv allowして出来上がり!

direnvはlts/*、.nvrmcのような派手な構造をサポートしていないことに注意してください。良い面として、direnvは、node、php、go、pyhton、rubyなどの多数のランタイムをサポートしているため、単一のツールを使用してパスの問題を解決できます。


0

@Adriano Pの回答を拡張して、あまり一般的ではない(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

0

私はOhMyZshと呼ばれるこのzsh構成フレームワークを使用します。これは、定期的に更新される非常にアクティブなリポジトリです。それを試してみてください、そして私はあなたがそれを気に入ると確信しています。ああ、それには自動.nvmrc機能が組み込まれているので、npmを介してパッケージをインストールするのと同じくらい簡単です!

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.