디렉토리에 .nvmrc 파일이있을 때마다 자동으로`nvm use` 실행


87

nvm use디렉토리에 .nvmrc 파일이있을 때마다 자동으로 실행 되도록 셸을 구성 하고 .nvmrc 파일이 없을 때 최신 버전 또는 전역 구성을 사용하는 방법은 무엇입니까?


2
이 사용 사례는 이제 Deep Shell Integration 아래 의 공식 nvm 문서문서화 되어 있습니다. 쉘에 대한 내 대답 도 볼 수 있습니다 . bash
d4nyll

답변:


86

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

추가 정보 : https://github.com/creationix/nvm#zsh


5
이것은 나를 위해 정말 잘 작동했지만 cd디렉토리를 변경할 때마다 실행되기 때문에 성능이 저하되었습니다 . 나는 [[ -a .nvmrc ]] || returnload-nvmrc ()의 첫 번째 줄에 추가 했고 그로 인해 성능이 크게 향상되었습니다.
Belgabad 19

@Belgabad 라인을 사용하면 스크립트가 .nvmrc상위 디렉토리를 확인 하지 않고 프로젝트 디렉토리 nodecd벗어날 때 기본 버전 으로 돌아 가지 않기 때문에 더 성능이 좋습니다 .
Rotareti 2019

49

bash 를 사용하는 경우 다음을 ~/.bashrc파일에 추가 할 수 있습니다 .

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

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

export PROMPT_COMMAND=enter_directory

30

@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

2
사용하여 수정VERSION=$(cat .nvmrc); nvm use $VERSION
hofnarwillie

나는 또한 완전히 다른 짐승 인 nvm-for-windows를 사용하고 있다고 말해야합니다. 그러나 위의 스크립트 + 수정으로 치료가 작동합니다. +1
hofnarwillie

26

Node.js https://github.com/wbyoung/avn의 자동 버전 전환에 대해 방금 알게되었으므로 사용할 수 있습니다.

이 스레드 https://github.com/creationix/nvm/issues/110을 따를 수도 있습니다.


28
이것은 우울하다 .. 도구 스택 깊이에 제한이 없습니까? node → npm → nvm → avn, 백업합니다. 한숨을 내쉬 겠습니다.하지만 제 열정은 해킹 할 때마다 약해지고 있습니다. (물론 gabo 링크에 감사드립니다.)
hraban

언급 된 스레드의 주석 중 어느 것도 나를 위해 bash와 함께 작동하지 않았습니다. 아마도 모두 MacOS 용일 것입니다. Ubuntu에서 작동하는 것에 대해서는 아래 내 대답을 확인하십시오.
devius

12

이 답변은 공식 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

@callum 단지 내 bash는 환경에서 실행을 관찰에서, 시간의 시험은 물론 느리다는 순식간에 대한, 아니 아무것도 중요한, 그러나 그것을 위해 실행 된 않았다
BossmanT

지연을 감지 할 수 없습니다. 달리기 cd는 대규모 배치로 수행 할 가능성이있는 일이 아니므로 지연이 사람에게 눈에 띄지 않는 한 중요하지 않다고 생각합니다.
callum

2

나는 이것에 대해 많은 해결책을 시도했지만 내가 원하는 방식으로 작동하지 않았으므로 직접 작성했습니다.

올바른 노드 버전으로 자동 전환하는 ZSH 기능

내가 아는 한, 다음 기준을 모두 충족하는 유일한 제품입니다.

  • 디렉토리 트리를 검색하여 가장 가까운 버전을 검색하여 항상 올바른 버전을 사용하도록 보장합니다 .nvmrc(예 :) nvm use.
  • 모든 유효한 .nvmrc형식을 처리 할 수 ​​있습니다 .
  • 설치된 버전이 .nvmrc,
  • 나무 위에 default아무 .nvmrc데도 없으면 원하는 것으로 가정합니다 .
  • 이미 올바른 Node 버전을 사용하고 있다면 완전히 조용하고 빠릅니다 .

1

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 ​​등과 같은 여러 런타임을 지원하므로 단일 도구를 사용하여 경로 문제를 해결할 수 있습니다.


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

저는 Oh My Zsh라는이 zsh 구성 프레임 워크를 사용합니다. 정기적으로 업데이트되는 매우 활동적인 저장소입니다. 그것을 시도하고 나는 당신이 그것을 좋아할 것이라고 확신합니다. 아, 자동 .nvmrc 기능이 내장되어 있으므로 npm을 통해 패키지를 설치하는 것만 큼 간단합니다!

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.