프로젝트마다 사용하는 Node 버전이 다르다면 nvm을 이용해서 버전을 변경할 수 있다. 하지만 매번 수동으로 노드 버전을 바꿔주는 것은 번거로운 일이다. direnv를 활용하면 프로젝트 폴더를 바꿀 때마다 노드 버전이 자동으로 바뀌도록 설정할 수 있다. direnv는 폴더별로 환경 변수를 관리해주는 도구다.

설치


  1. direnv 설치

    brew install direnv # homebrew로 direnv 설치
    
  2. direnv hook 설정 (폴더 이동시 해당 폴더의 .envrc 파일 자동 실행)

    oh-my-zsh를 사용한다면 .zshrc 파일 plugins 배열에 direnv를 추가하면 자동으로 설정된다.

    plugins=(... direnv)
    

    oh-my-zsh를 사용하지 않는다면 아래 코드를 .zshrc 파일에 추가한다.

    eval "$(direnv hook zsh)"
    
  3. shell 다시 시작

    source ~/.zshrc
    

설정


이제 폴더를 이동할 때마다 direnv hook이 현재 및 부모 폴더에 .envrc 설정 파일이 있는지 확인하고, 있다면 해당 디렉토리만을 위한 설정(.envrc 파일에 입력한 환경변수 등)을 로드한다. 디렉토리를 빠져나오면 이 설정들이 언로드된다. 이렇게 direnv를 사용하면 폴더별로 노드 버전이나 환경변수를 관리할 수 있기 때문에, 모든 환경 변수를 ~/.zshrc 파일에 몰아넣지 않아도 되는 장점이 있다.

.nvmrc 파일 생성

<aside> 💡 .nvmrc 파일은 개별 프로젝트를 위한 설정파일로, 해당 프로젝트가 사용하는 노드 버전 명시한다

</aside>

  1. 프로젝트 최상위 폴더에 .nvmrc 파일 생성

    $ touch .nvmrc
    
  2. .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)
    

.envrc 파일 생성

<aside> 💡 폴더를 이동할 때마다 direnv hook이 현재 및 부모 폴더에 .envrc 설정 파일이 있는지 확인하고, 있다면 해당 디렉토리만을 위한 설정을 로드한다.

</aside>

  1. 프로젝트 최상위 폴더에 .envrc 파일 생성 (.nvmrc 파일을 생성한 동일한 경로)

    $ touch .envrc
    
  2. .envrc is blocked... 경고 문구가 나오면 direnv allow 명령어로 현재 디렉토리의 .envrc 파일 권한을 허용해준다. 권한 허용 메시지는 .envrc 파일을 수정할 때마다 나온다

    $ direnv allow
    
  3. .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로 편집기 설정
    

환경 변수 추가