Contents

프로젝트별 각각의 node 버전을 nvm으로 자동 적용하기

 


새로운 프로젝트는 Node 버전 중 현재 최신 LTS 버전인 20 버전으로 진행하려는데, 기존 진행중인 프로젝트가 AWS-ec2에서 node@16으로 세팅되어있던 터라, macOS에서 2개 버전을 설치해 사용해야하는 상황이 왔다.1

때문에 여러 node 버전을 사용할 수 있는 nvm(Node version Manager)을 설치
설치는 brew를 통해 설치했고 이후 과정은 brew에서 자세하게 설명해준다.

장점

  1. OS에 하나 이상의, 여러 version별 node를 설치하고
  2. 프로젝트별로 각각 다른 버전의 node를 사용할 수 있다.

단점

node 프로젝트 진행시 터미널에서 해당 프로젝트를 적정 버전으로 실행시키기 위해서는 다음 명령어로 node의 버전을 사용할 때마다 항상 지정해줘야 한다.

# node 특정 버전 설치 (아래 3가지 명령어중 택일)
nvm install --lts // 가장 최신 LTS 버전을 설치
nvm install 18.10.2 // 특정 버전 설치
nvm install 20  // 20.x.x에서 가장 최신버전을 설치

# nvm default 버전 설정 방법
nvm alias default 14.17.0

# 설치된 node version들 확인
nvm list  
# 또는 아래 명령어를 사용해도 된다. 
nvm ls 

# 특정 버전 사용을 명령 (버전 번호만 적어주면 된다.)
# 예시
nvm use 18  // 설치된 18.x.x에서 가장 최신버전을 사용
nvm use 16.12.5 // 16.12.5 버전을 사용

보완

1. IDE 사용하기

/images/Pasted%20image%2020240201223157.png

IntelliJ 또는 WebStorm과 같은 IDE에서는 따로 실행 환경을 설정해줄 수가 있다.

2. .nvmrc 사용하기

.nvmrc 관련 문서 프로젝트별 root 폴더에 .nvmrc 파일을 만들고 아래와 같이 버전만 딱 한줄 넣어주면 된다.

16.20.2

또는 16버전의 최신 버전 사용시 16이라고만 입력해도 된다.
 

그리고 터미널에서 해당프로젝트에 위치해있을 때, 버전을 입력할 필요없이 nvm use 명령어만 입력해줘도 .nvmrc파일에서 버전을 읽어와 해당 node버전을 적용한다.
 

note
이제 프로젝트별로 nvm에서 노드 버전을 지정할 때, 그동안 타이핑하기 힘들었던 3단어(nvm, use, <version>)에서 무려 1단어를 줄이고 단 2단어만(nvm, use) 입력하면 된다.
별거 아닌것 같지만 프로젝트별 각각의 노드 버전을 사용할때마다 찾아보는 것도 일이다.

 
 

프로젝트별 node 버전을 자동으로 적용하기

위 방법도 편리하지만 여전히 사용할 때마다 명령어를 입력해줘야 하기는 마찬가지다.
이제 이 명령어조차 생략하는 방법을 소개한다.
 

이 방법은 바로 위 .nvmrc 사용하기에서 더 나아가 nvm use 명령까지 자동화하는 방법으로서 다음의 과정을 따른다.

  1. .nvmrc파일이 존재할 경우,
  2. 자동으로 nvm use 명령을 내리고 해당 버전을 적용한다.
  3. 해당 파일이 없는 root 폴더로 진입했을 땐, default 버전으로 되돌린다.

 

zshrc를 사용하고 있다면 다음 문서의 내용대로 진행할 수 있다.2

 

# place this after nvm initialization!
# nvm을 설치하면서 추가했던 스크립트 바로 다음에 위치시키면 정상 작동한다. 
autoload -U add-zsh-hook

load-nvmrc() {
local nvmrc_path
nvmrc_path="$(nvm_find_nvmrc)"

if [ -n "$nvmrc_path" ]; then
local nvmrc_node_version
nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")

if [ "$nvmrc_node_version" = "N/A" ]; then
nvm install
elif [ "$nvmrc_node_version" != "$(nvm version)" ]; then
nvm use
fi
elif [ -n "$(PWD=$OLDPWD nvm_find_nvmrc)" ] && [ "$(nvm version)" != "$(nvm version default)" ]; then
echo "Reverting to nvm default version"
nvm use default
fi
}

add-zsh-hook chpwd load-nvmrc
load-nvmrc

 
 
 

터미널 테마 powerlevel10k 사용자는 주의

zsh에서 혹시 Powerlevel10k를 사용하고 있다면 기본 터미널 앱 또는 IDE의 터미널 등에서 다음과 같은 경고 메세지를 볼 수 있다.

[WARNING]: Console output during zsh initialization detected.

When using Powerlevel10k with instant prompt, console output during zsh
initialization may indicate issues.

You can:

Recommended: Change ~/.zshrc so that it does not perform console I/O
after the instant prompt preamble. See the link below for details.

* You will not see this error message again.
* Zsh will start quickly and prompt will update smoothly.

Suppress this warning either by running p10k configure or by manually
defining the following parameter:

typeset -g POWERLEVEL9K_INSTANT_PROMPT=quiet

* You will not see this error message again.
* Zsh will start quickly but prompt will jump down after initialization.

Disable instant prompt either by running p10k configure or by manually
defining the following parameter:

typeset -g POWERLEVEL9K_INSTANT_PROMPT=off

* You will not see this error message again.
* Zsh will start slowly.

Do nothing.

* You will see this error message every time you start zsh.
* Zsh will start quickly but prompt will jump down after initialization.

위 경고 메세지에서 친절하게 제시한 권장 해결방법대로 nvm 자동 스크립트를 Powerlevel10k 스크립트보다 더 윗부분으로 올리면 된다.
대개 Powerlever10k 스크립트는 ~/.zshrc 파일의 가장 상단에 위치하고 있다.
 

단점은 IDE에서 터미널을 실행시켰을 때, 이전에 비해 조금 더 늦게 프롬프트가 나타난다.


  1. EC2에서 node 버전 업 호환을 위해서는 최초 인스턴스 세팅시 진행하는 Linux 버전을 최신버전으로 바꾸면 가능하다. 하지만 그 과정이 꽤나 번거롭다. ↩︎

  2. zshrc에서 명령 스크립트 공식문서 ↩︎