Homebrew로 nvm을 설치하고 nvm -v를 쳤는데 에러가 났다.

원인은 설치가 반만 끝났다는 데 있었다. Homebrew는 nvm 파일을 내려놓기만 하고, 셸이 그 파일을 불러오게 만드는 일은 사용자에게 남긴다. 이 글에서는 그 나머지 설정 세 가지를 정리한다.

nvm은 셸이 불러와야 생기는 명령이다

nvm은 /usr/local/bin 같은 곳에 놓이는 실행 파일이 아니다. nvm.sh 스크립트를 셸에서 source하면 그때 nvm이라는 셸 함수가 정의된다. 그래서 nvm.sh를 읽지 않은 셸에서는 설치가 끝났어도 nvm이 없다. 아래 설정은 결국 새 셸이 뜰 때마다 이 스크립트를 읽게 하는 작업이다.

버전을 담을 디렉터리부터 만든다

nvm이 설치한 Node 버전을 저장할 디렉터리가 아직 없다면 만든다.

mkdir ~/.nvm

nvm 스크립트는 Homebrew 경로에 있고 내려받은 Node 버전은 이 디렉터리에 따로 쌓인다.

.zshrc에서 nvm.sh를 불러온다

새 셸 세션마다 nvm이 초기화되도록 셸 프로필 파일에 아래 내용을 추가한다. 프로필 파일은 셸에 따라 ~/.bash_profile, ~/.zshrc, ~/.profile 등이다. 나는 ~/.zshrc에 넣었다.

# nvm이 Node 버전을 저장할 위치
export NVM_DIR="$HOME/.nvm"
# nvm.sh가 있으면 읽어서 nvm 함수를 정의한다
[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh"  # This loads nvm
# 탭 자동완성 스크립트도 있으면 읽는다
[ -s "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" ] && \. "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm"

[ -s 파일 ]은 파일이 있고 비어 있지 않은지 검사한다. 참이면 && 뒤의 \.(source와 같은 명령)으로 그 파일을 현재 셸에 읽어 들인다. 경로의 /opt/homebrew는 Apple Silicon Mac의 Homebrew 경로라서 Intel Mac이라면 brew --prefix nvm으로 실제 경로를 확인하고 바꿔 넣어야 한다.

지금 열린 셸에 반영하고 확인한다

프로필을 고쳐도 이미 열려 있는 셸은 그대로다. 다시 읽어 들인다.

source ~/.zshrc

버전이 찍히면 끝이다.

nvm --version

이후에는 이렇게 쓴다.

  • 사용 가능한 Node.js 버전 확인: nvm list-remote

  • 특정 Node.js 버전 설치: nvm install {node_version}

정리

brew install nvm은 파일만 깔아 준다. ~/.nvm을 만들고 프로필에서 nvm.sh를 불러와야 비로소 nvm 명령이 생긴다. 참고로 nvm 공식 README는 Homebrew 설치를 지원하지 않는다고 적어 두었으니, 이 방법으로도 이상하면 공식 설치 스크립트로 다시 까는 것도 방법이다.

참고자료