nvm use
디렉토리에 .nvmrc 파일이있을 때마다 자동으로 실행 되도록 셸을 구성 하고 .nvmrc 파일이 없을 때 최신 버전 또는 전역 구성을 사용하는 방법은 무엇입니까?
답변:
zsh (z 쉘) 를 사용하는 경우 :
.nvmrc 파일이있는 디렉토리에서 자동으로 'nvm use'호출
nvm이 사용할 노드를 알려주는 문자열과 함께 .nvmrc 파일이 포함 된 디렉토리를 입력 할 때마다 자동으로 nvm use를 호출하도록 $ HOME / .zshrc에 넣으십시오.
# 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
load-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는 OS X 및 많은 배포판과 함께 제공되므로 설치할 필요가 없습니다.
사용하는 셸에 따라 .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
마지막으로 디렉토리로 이동하십시오. (.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
저는 Oh My Zsh라는이 zsh 구성 프레임 워크를 사용합니다. 정기적으로 업데이트되는 매우 활동적인 저장소입니다. 그것을 시도하고 나는 당신이 그것을 좋아할 것이라고 확신합니다. 아, 자동 .nvmrc 기능이 내장되어 있으므로 npm을 통해 패키지를 설치하는 것만 큼 간단합니다!
여전히 위의 문제에 직면하고있는 사람을 위해 README nvm
에이 섹션이 있습니다.
https://github.com/creationix/nvm#deeper-shell-integration
개인적으로 나는 다른 솔루션보다 .bashrc
( https://github.com/creationix/nvm#automatically-call-nvm-use ) 편집을 선호 합니다.
bash