node.js 의 여러가지 버전을 프로젝트마다 다르게 사용하기

발단

요새 언어의 인터프리터/런타임은 시시때때로 버전업이 이루어지고 하위호환성이 깨질때가 많아서 system version 말고 프로젝트 같은 환경마다 언어 버전을 다르게 사용하는 version manager를 많이 사용한다. node.js 에도 같은 역할을 하는 것 중에 하나가 nvm이다.

하지만 사실 내가 node.js를 메인으로 하는 프로젝트를 빡세게 진행하는 것도 아니어서 처음엔 설치해봤다가 그냥 homebrew로 늘 최신버전으로 업그레이드해서 그걸 써왔다.

그러다가 얼마전부터 새로 맡게 된 프로젝트의 grunt 빌드 결과 파일이 다른 작업자들과 이번에 새로 합류한 나와 같은 작업자들간에 크게 차이가 난다는 것을 오늘 알게 되었다. 왜 그런걸까 추적을 하다보니, 정확히 검증은 하지 못했지만 기본 작업자들은 옛날에 설치한 node.js 6.x를 사용하고 있었고, 새로 합류한 작업자들은 node.js 11.x 를 설치한 상태였다.

그래서 node.js 6.x 와 node.js 11.x 의 런타임을 번갈아가며 동일한 package-lock.json 으로 모듈을 설치하면서 빌드를 해서 결과를 비교해보기로 했다.

경과

nvm 공식 페이지에서는 homebrew 인스톨은 지원하지 않는다고 명시하고 있지만, 귀찮아서 homebrew 를 택했다.

설치하고, 안내에 따라 .nvm 을 생성하고, 필요한 초기화 코드를 쉘 프로파일에 추가했다.

brew install nvm
mkdir ~/.nvm
vi .bash_profile

nvm 이 지원하는 버전을 살펴보고, 기존 동료가 사용하던 6.9.2를 설치하고 그 프로젝트에서는 6.9.2를 사용하도록 .nvmrc 를 세팅했다.

node --version
nvm ls
nvm ls-remote
nvm install 6.9.2
echo "6.9.2" > ~/project/our-project/.nvmrc
nvm use
node --version

반복해서 node 런타임을 번갈아 설정하고 node_modules 도 삭제해가며 빌드를 반복해보니, 11.x 를 사용할때와 확실히 다른 결과가 나왔다. 우선 오늘 겪은 node.js 버전에 따른 문제는 짐작가는 부분이 있긴하지만 그에 대한 검증은 시간상 차후로 미루기로 하고, nvm 을 사용해서 작업자들간에 동일한 작동을 하도록 할 수 있다는 조치로 만족하기로 했다.

쉘 통합

위 내용으로는 매번 사용할때마다 쉘에서 nvm use 명령을 내려야 지정한 버전을 사용하도록 구성이 된다. 쉘 통합을 하면 쉘에서 cd 로 디렉토리를 옮길때 해당 환경에 지정된 node 버전을 찾아서 자동으로 nvm use 를 내린 효과를 거둘 수 있다. nvm 에서 직접 제공하는 쉘 함수도 있고, 여러 version manager 를 지원하는 외부 툴도 있다. 둘다 하는 일은 거의 같다. 쉘 프로파일에 특정 코드를 집어넣고, 그 코드에서는 cd 를 할때마다 현재 디렉토리로부터 상위 디렉토리로 올라가면서 .nvmrc.node_version 같은 파일이 존재하는지 체크를 하고, 그 파일이 존재하면 해당 버전으로 적용을 하도록 쉘을 구성한다.

다만 테스트를 해보긴 했으나 다시 제거했다. nodejs를 그렇게 비중있게 사용하는 것이 아닌데, 쉘 프로파일에 이미 nvm 관련 코드로 인해 쉘 시작이 느려진 느낌이 드는데 여기에 쉘 통합 코드까지 넣으면 cd 할때마다 걸리는 부담이 있어 평상시 사용에 불편함이 있을 것 같아 보였다. 디폴트는 최신 버전으로 두고, 특정 버전 테스트가 필요할때만 nvm use를 사용하기로 했다.

참고

  • https://github.com/creationix/nvm#deeper-shell-integration
  • https://github.com/wbyoung/avn/