회사에서 사이드 프로젝트를 진행 중이다. 3개의 다른 프로젝트 인원들이 모여 디버거를 만들고 있다.
A 프로젝트의 node 버전 => 16
B 프로젝트의 node 버전 => 18
C 프로젝트의 node 버전 => 20
3개의 프로젝트에서 사용하는 node 버전이 모두 다르다보니 사이드 프로젝트를 진행할 때마다 node 버전을 변경해야하는 귀찮음이 있었고 이에 대한 해결 방안을 정리한 글이다.
"nvm"은 Node Version Manager의 약자로, Node.js 버전을 관리하는 도구입니다. Node.js는 JavaScript를 실행하는 런타임 환경이며, 여러 버전이 존재합니다. 프로젝트마다 특정 버전의 Node.js가 필요할 수 있기 때문에 nvm은 사용자가 간편하게 Node.js 버전을 변경하고 관리할 수 있게 도와줍니다.
nvm을 사용하면 컴퓨터에 여러 Node.js 버전을 설치하고, 프로젝트마다 필요한 버전을 선택하여 사용할 수 있습니다. 이를 통해 각 프로젝트의 요구에 맞게 Node.js 버전을 설정할 수 있어 개발 환경을 효율적으로 관리할 수 있습니다. nvm은 다양한 운영 체제에서 사용할 수 있으며, 명령어를 통해 간편하게 버전을 변경하고 설치할 수 있습니다.
nvm에서는 해당 기능을 위한 shell script code를 제공하고 있다.
.bashrc 파일을 수정하는 방법과 .zshrc 파일을 수정하는 방법을 제공하는데 이중 .zshrc 파일을 수정하는 방법을 확인해본다.
# place this after nvm initialization!
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
해당 코드를 ~/.zshrc 파일 nvm 초기화 코드 밑에 추가해주면된다.
project root에 .nvmrc 파일이 존재하는 경우 해당 파일에서 명시하고 있는 node 버전을 사용하게 된다.
.nvmrc 파일이 존재하지 않는 경우 default로 설정된 node 버전을 사용하게 된다.
위의 코드 중 cat "$(nvm_find_nvmrc)" 명령어가 어떻게 실행되는지 궁금했는데,
https://github.com/nvm-sh/nvm/blob/811c039e2b6fb305e6eb2269d7aa0d21eb067586/nvm.sh#L462
nvm.sh 파일에 의헤 등록된 함수 호출이라는 것을 확인해볼 수 있었다.
진입 시점에 node 버전을 바꿔주는거지 항상 node 버전을 강제하는 것은 아니다.
함께 사이드 프로젝트를 진행하는 팀원분이 추천해주신 툴이다.
nvm은 node version만을 관리하기 위한 툴이라면, volta는 node version을 비롯한 모든 JavaScript Command Line 툴이다.
// package.json
{
// ...
"engines": {
"node": ">=18"
},
"volta": {
"node": "18.17.0",
"yarn": "1.22.22"
}
}
다음과 같이 package.json 파일에 버전을 명시해두면 프로젝트 진입시 이에 맞는 버전이 자동 설정된다. (nvm과 동일한 동작이다.)
다만 주의할 점은 사용하는 패키지 매니저의 버전도 반드시 함께 명시해야 한다.
프로젝트의 node 버전을 관리하는 툴은 크게 nvm과 volta가 존재한다.
두가지 모두 분명한 진입 장벽이 존재한다.
nvm의 경우 가장 대중적인 툴이기 때문에 모든 사용자의 로컬에 설치가 되어있다고 가정한다면, 자신이 사용하는 shell의 종류를 확인하고 이에 대한 설정 파일을 수정해야한다는 점이 가장 큰 장벽이다.
volta의 경우 생소한 툴이기 때문에 설치를 해야한다는 점 자체가 진입 장벽이 될 수 있다. 또한 volta를 사용하는 프로젝트와 volta를 사용하지 않는 프로젝트를 동시에 진행한다면 매번 다르게 설정을 해야하는 문제가 생길 수도 있다.
결국 어떻게 이 진입 장벽을 해소할 수 있느냐가 선택의 기준이 될 것 같다. (개인적으로는 nvm이 더 괜찮아보인다.)
해당 글에 의하면 preinstall 시점에 "preinstall": ". ~/.nvm/nvm.sh && nvm use 18" 해당 명령어를 통해 명령어를 통해 node 버전을 바꾸고 패키지를 설정할 수 있다고 한다.
https://github.com/nvm-sh/nvm/issues/2773
하지만 preinstall을 사용하는 방법은 불가능하다. nvm과 npm이 사용하는 shell이 다르기 때문에 해당 방법으로는 바뀐 node 버전으로의 패키지 설치가 불가한 것이다.
실제로 다른 shell을 사용하는 것을 확인해볼 수 있다.
회사에서 사이드 프로젝트해서 사이드가서 탐욕스럽게 cs다 드시는건가요?