nvm use
ディレクトリに.nvmrcファイルがあるたびに自動的に実行され、.nvmrcファイルがない場合は最新バージョンまたはグローバル構成を使用するようにシェルを構成するにはどうすればよいですか?
回答:
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
cd
ディレクトリを変更するたびに実行されるため、パフォーマンスが低下しました。私は、追加[[ -a .nvmrc ]] || return
負荷nvmrc()の最初の行に、それが大幅にそれの性能向上
.nvmrc
親ディレクトリをチェックせず、プロジェクトディレクトリから出たnode
ときにデフォルトバージョンに戻らないため、パフォーマンスが向上しますcd
。
@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
node v.0.0 (64-bit) is not installed.
、.nvmrcファイルに9.3
。が含まれている場合でもこれが返されます。
VERSION=$(cat .nvmrc); nvm use $VERSION
Node.jsの自動バージョン切り替えについて知りましたhttps://github.com/wbyoung/avn、それを使用できます。
このスレッドをフォローすることもできます https://github.com/creationix/nvm/issues/110
この回答は、公式の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'
これは以下の改善です。
avn
)このエイリアスは、.nvmrc
ファイルを検出するために、現在のディレクトリから「上」を検索します。見つかった場合は、そのバージョンに切り替わります。そうでない場合は、デフォルトバージョンが使用されます。
cd
は、大規模なバッチで行う可能性が高いことではないので、人間がラグに気付かない限り、それは重要ではないと思います。
私はこれに対して多くの解決策を試しましたが、私が望むように何も機能しなかったので、私は自分自身を書きました:
私の知る限り、これは次のすべての基準を満たす唯一のものです。
.nvmrc
(のようにnvm use
)。.nvmrc
形式を処理できます。.nvmrc
、明確に警告します。default
の.nvmrc
どこにも存在しない場合は、必要であると想定します。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などの多数のランタイムをサポートしているため、単一のツールを使用してパスの問題を解決できます。
@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
私はOhMyZshと呼ばれるこのzsh構成フレームワークを使用します。これは、定期的に更新される非常にアクティブなリポジトリです。それを試してみてください、そして私はあなたがそれを気に入ると確信しています。ああ、それには自動.nvmrc機能が組み込まれているので、npmを介してパッケージをインストールするのと同じくらい簡単です!
上記の問題にまだ直面している人のために、READMEにnvm
はこのセクションがあります
https://github.com/creationix/nvm#deeper-shell-integration
個人的には、他のソリューションよりも.bashrc
(https://github.com/creationix/nvm#automatically-call-nvm-use)を編集する方が好きです。
bash