사야매(사회인야구매니저)

nvm use (.nvmrc) 이슈 (feat. window, cmd, bash)

차가운에스프레소 2023. 6. 8. 15:14

1. 개요

- 사야매 프로젝트 기본 세팅을 진행하면서, nvm을 사용하기로 했다.

- nvm을 사용하기로 한 이유는 다음과 같다.

=> node.js 버전을 v20.2.0 채택했다. es2023에서 제공하는 문법들도 경험할 수 있으리라 판단했기 때문이다.

=> 어플리케이션이 의존하고 있는 node.js 실행환경은 docker로 맞출 수 있다.

=> 하지만 로컬 node.js 환경 자체는 docker로 맞출 수 없다.

=> 로컬에서 작업을 할 때, ide 자체는 로컬 환경에 기반하므로, 코드 자동완성이나 패키지 설치에서 버전 이슈가 발생할 수 있다.

=> node.js 버전 매니저인 nvm을 이용하면, 로컬에서 사용하는 node.js 버전을 간편하게 맞출 수 있어, 사용하기로 했다.


2. nvm에 대한 간단한 소개

- 위에서 언급했듯, nvm은 node.js 버전 매니저이다.

- nvm을 이용하면 개발 협업 과정에서 node.js 버전을 간편하고 유연하게 진행하고 있는 프로젝트에 따라 변경할 수 있다.

- 필자는 window를 사용하고 있는데, 아래 링크를 통해 window용 nvm을 설치할 수 있다.

https://github.com/coreybutler/nvm-windows  

- nvm에서 주로 사용되는 기능은 다음과 같다.

1. nvm install <version>: node.js 특정 버전을 nvm에 설치
2. nvm list: nvm에 설치된 node.js 버전 목록 조회
3. nvm use <version>: 현재 로컬환경에서 nvm에 설치된 여러 버전 중 특정 버전을 사용하도록 변경

- 위 기능들을 이용해, 개발 협업 시 각자의 로컬에서 node.js 버전을 간편히 맞출 수 있다.


3. .nvmrc

- .nvmrc 파일을 이용하면 프로젝트에서 더 간편하게 node.js 버전을 관리할 수 있다.

- 예컨대, 프로젝트 루트경로에 .nvmrc가 있고,.nvmrc에 node.js 버전이 명시되어 있으면, 명령어가 더 간략해진다. 

# .nvmrc가 없을 시
nvm use <version>

# 프로젝트 경로에 .nvmrc가 있을 시
nvm use

- 그래서 nvm을 이용할 때, .nvmrc가 있으면 더욱 좋을 것이다.


4. window에서는 .nvmrc가 참조되지 않는다.

- 보통 nvm은 명령어 실행 시, 명령어를 실행한 경로에 있는 .nvmrc를 참조해서 명령어를 실행한다고 한다.

- 하지만, 필자의 컴퓨터에서는 다음과 같은 에러가 발생했다.

A version argument is required but missing.

- 원인을 찾아보니, 다음과 같은 issue를 확인할 수 있었다.

Unfortunately nvm use on Windows does not change the node version to that specified in the .nvmrc file as its not supported on nvm for Windows: coreybutler/nvm-windows#388
So the easiest solution to this is to use a simple Powershell command that performs an approximation of the command as follows: nvm use $(Get-Content .nvmrc).replace( 'v', '' );

- 요약하자면, window에서는 .nvmrc 기능이 지원되지 않는다는 것이다.

 


5. bash 명령어를 이용해서 .nvmrc 참조

- 그래서 window에서는 bash 상의 명령어를 이용해서 다음과 같이 이용해  .nvmrc를 이용할 수 있다.

nvm use $(cat .nvmrc)

c.f) cat .nvmrc: .nvmrc에 담긴 내용을 조회

번외) cmd와 bash | cmd보다는 bash로 터미널을 이용하자.

- 사실 필자는 window 환경을 쓰고 있고, 여태까지 개발하면서 cmd를 터미널로 이용했었다.

- 근데 nvm use $(cat .nvmrc) 명령어가 먹지 않는 문제를 겪었다. cmd나 bash나 주로 써왔던 명령어만 써왔어서, $() 명령어가 bash에서만 사용되는지 솔직히 잘 몰랐다.

- 그래서 사용하는 터미널을 cmd에서 bash로 변경해서 위 문제를 해결했는데, 겸사겸사 cmd와 bash의 차이점을 좀 알아봤다.

 

1. cmd

- window용 명령어 인터페이스

- 직접적으로 linux 명령어를 사용할 수 없다.

- 사용하고자 한다면, window 10부터 제공되는 WSL(윈도우용 리눅스)를 설치하고 사용할 수 있다.

- 명령어 기능이나 스크립팅 기능이 제한적이다.

 

2. bash

- linux용 명령어 인터페이스

- 강력하고 유연한 명령어 기능을 제공한다.

 

- 개인적으로, bash가 좀 더 유연한 명령어 기능을 제공하고, 터미널 작업 관련해서는 bash가 좀 더 커뮤니티가 큰 것으로 보아, window 자체 명령어를 사용하는 것이 아니라면, cmd가 아니라 bash 환경에서 터미널 작업을 하는 것이 좋다고 느꼈다.