프로젝트마다 사용하는 Node 버전이 다르다면 nvm을 이용해서 버전을 변경할 수 있다. 하지만 매번 수동으로 노드 버전을 바꿔주는 것은 번거로운 일이다. direnv
를 활용하면 프로젝트 폴더를 바꿀 때마다 노드 버전이 자동으로 바뀌도록 설정할 수 있다. direnv는 폴더별로 환경 변수를 관리해주는 도구다.
direnv 설치
brew install direnv # homebrew로 direnv 설치
direnv hook 설정 (폴더 이동시 해당 폴더의 .envrc
파일 자동 실행)
oh-my-zsh를 사용한다면 .zshrc
파일 plugins
배열에 direnv
를 추가하면 자동으로 설정된다.
plugins=(... direnv)
oh-my-zsh를 사용하지 않는다면 아래 코드를 .zshrc
파일에 추가한다.
eval "$(direnv hook zsh)"
shell 다시 시작
source ~/.zshrc
이제 폴더를 이동할 때마다 direnv hook이 현재 및 부모 폴더에 .envrc
설정 파일이 있는지 확인하고, 있다면 해당 디렉토리만을 위한 설정(.envrc
파일에 입력한 환경변수 등)을 로드한다. 디렉토리를 빠져나오면 이 설정들이 언로드된다. 이렇게 direnv를 사용하면 폴더별로 노드 버전이나 환경변수를 관리할 수 있기 때문에, 모든 환경 변수를 ~/.zshrc
파일에 몰아넣지 않아도 되는 장점이 있다.
<aside> 💡 .nvmrc 파일은 개별 프로젝트를 위한 설정파일로, 해당 프로젝트가 사용하는 노드 버전 명시한다
</aside>
프로젝트 최상위 폴더에 .nvmrc
파일 생성
$ touch .nvmrc
.nvmrc
파일에 사용하고 싶은 node 버전 입력.
16.13.1
참고로 .nvmrc
파일이 있는 폴더에서 nvm use
명령어를 실행하면, .nvmrc
파일에 입력한 노드 버전으로 교체된다(nvm use 16.13.1
명령어를 입력한 것과 동일)
$ nvm use
# Found... .nvmrc' with version <16.13.1>
# Now using node v16.13.1 (npm v8.1.2)
<aside> 💡 폴더를 이동할 때마다 direnv hook이 현재 및 부모 폴더에 .envrc 설정 파일이 있는지 확인하고, 있다면 해당 디렉토리만을 위한 설정을 로드한다.
</aside>
프로젝트 최상위 폴더에 .envrc
파일 생성 (.nvmrc
파일을 생성한 동일한 경로)
$ touch .envrc
.envrc is blocked...
경고 문구가 나오면 direnv allow
명령어로 현재 디렉토리의 .envrc
파일 권한을 허용해준다. 권한 허용 메시지는 .envrc
파일을 수정할 때마다 나온다
$ direnv allow
.envrc
파일에 아래 내용 추가한다. 그럼 해당 프로젝트 폴더로 이동할 때마다 .nvmrc
파일에 입력한 node 버전으로 자동 변경된다.
NVM_DIR=$HOME/.nvm # NVM_DIR 변수에 ~/.nvm 디렉토리 지정
# 조건문 [[ -e FILE ]] -> FILE이 존재하면
# 조건문 [[ -s FILE ]] -> FILE 사이즈가 0 바이트보다 크면
if [ -s $NVM_DIR/nvm.sh ]; then
source $NVM_DIR/nvm.sh # 스크립트 실행(서브 쉘을 생성하지 않고 현재 쉘에서 실행)
nvm use
fi
direnv edit
명령어로 현재 폴더의 .envrc
파일을 바로 수정할 수도 있다. 이때 EDITOR
환경 변수가 설정되어 있지 않다면 텍스트 편집기로 열린다. 다른 편집기로 열고 싶다면 ~/.zsrhc
파일에 아래 환경 변수를 추가한다.
export EDITOR="code --wait" # VSCode로 편집기 설정