npmrc 파일과 npm config 커맨드
이번 포스팅에서는 npm 설정을 할 때 필요한 npmrc 파일과 npm config
커맨드에서 대해서 알아보겠습니다.
npmrc 파일
npmrc 파일은 npm에서 설정을 저장해두는 파일로서 내장(builtin), 전역(global), 사용자(user), 프로젝트(project) 이렇게 4가지 범위의 npmrc
파일이 존재하는데요.
먼저 내장 설정은 npm이 설치된 경로에 있는 npmrc
파일에 명시되어 있으며 모든 기본 설정을 담고 있습니다.
전역 설정은 같은 컴퓨터를 사용하는 다른 사용자와 모든 프로젝트에 광범위하게 적용되기 때문에 일반적으로 잘 건드리지 않습니다.
따라서 실제로 우리는 주로 사용자 범위와 프로젝트라 범위에서 npmrc 파일을 다룬다고 보면 되고요.
보통 파일명 앞에 .
을 붙여 기본적으로 숨긴 파일이 됩니다.
사용자 범위의 .npmrc
파일은 운영체제의 사용자 홈(home) 디렉토리에 위치하고, 프로젝트 범위의 .npmrc
파일은 프로젝트 최상위(root) 디렉토리에 위치합니다.
기본적으로 프로젝트 범위가 사용자 범위보다 좁으며 따라서 프로젝트 설정이 사용자 설정보다 우선시됩니다. 여러 프로젝트에 적용되야 하는 설정은 사용자 범위에 명시하고 특정 프로젝트에 적용되야 하는 설정은 프로젝트 범위에서 명시하는 것이 좋습니다.
npm config 커맨드
npmrc 파일을 열어서 직접 편집하려면 오타의 위험도 있고 npmrc 파일이 여러군데 있으니 관리도 쉽지 않을 것입니다.
따라서 npm
은 여러 npmrc 파일을 손쉽게 관리할 수 있도록 npm config
커맨드를 제공해주고 있습니다.
npm config
커맨드를 사용할 때는 --locaiton
또는 -L
옵션을 통해서 범위를 지정해줄 수 있는데요.
이 옵션을 global
로 설정하면 전역, user
로 설정하면 사용자, project
로 설정하면 프로젝트 범위가 적용됩니다.
기본값은 user
이기 때문에 사용자 홈 디렉토리에 있는 .npmrc
파일을 상대로 커맨드가 실행된다고 보시면 됩니다.
설정 읽기
먼저 npmrc 파일로 부터 특징 옵션에 대한 설정 값을 읽어오는 방법부터 알아보겠습니다.
npm config get {키}
커맨드를 사용하면 어떤 옵션 키에 대한 설정 값을 읽어올 수 있습니다.
예를 들어, 패키지를 설치할 때 package-lock.json
파일을 고려하는지 여부를 확인해보겠습니다.
$ npm config get package-lock
true
고려하네요.
현재 어떤 npm 저장소를 사용하고 있는지 확인해보겠습니다.
$ npm config get registry
https://registry.npmjs.org/
npm 공개(public) 저장소를 사용하네요.
이번에는 npm 캐시를 저장하는 경로가 어디인지 확인해보겠습니다.
$ npm config get cache
/Users/daleseo/.npm
이 값은 운영체제에 따라 다르겠죠?
사용자 범위의 설정을 저장하는 npmrc 파일 위치도 확인할 수 있습니다.
$ npm config get userconfig
/Users/daleseo/.npmrc
마찬가지로 여러분이 사용하시는 운영체제에 따라 다를 것입니다.
참고로 저는 macOS를 사용하기 때문에 사용자 홈 디렉토리가 /Users/사용자명
입니다.
설정 쓰기
어떤 옵션 키에 대한 설정 값을 npmrc 파일에 쓸 때는 npm config set {키}={값}
을 사용합니다.
예를 들어, 패키지를 설치할 때 package-lock.json
파일을 무시하고 싶다면 package-lock
키를 false
로 설정할 수 있습니다.
$ npm config set package-lock false
일부 유료 패키지를 npm 공개 저장소가 아닌 사설 저장소에서 내려받아야 하는 경우가 있는데요.
예를 들어, @fortawesome
패키지를 https://npm.fontawesome.com/
저장소에서 내려받아야 한다면 다음과 같이 저장소 URL과 인증 토큰을 설정해줄 수 있습니다.
$ npm config set @fortawesome:registry=https://npm.fontawesome.com/
$ npm config set //npm.fontawesome.com/:_authToken=${FONTAWESOME_NPM_AUTH_TOKEN}
또 다른 예로, npm 저장소에 접근할 때 프록시 서버를 거쳐야 한다면 다음과 같이 관련 옵션을 설정해줄 수 있습니다.
$ npm config set proxy=http://proxy.company.com:8080
$ npm config set https-proxy=http://proxy.company.com:8080
$ npm config set strict-ssl=false
위에서 설명드린 것 처럼 npm config
명령어는 기본적으로 사용자 범위에서 설정을 합니다.
만약에 프로젝트 최상 디렉토리에 있는 .npmrc
파일에 설정 값을 쓰려면 --location
옵션을 project
로 주면 됩니다.
실습을 위해서 위에서 설정한 package-lock
옵션과 @fortawesome:registry
옵션을 프로젝트 범위에서 한번 재설정해 줘 볼께요.
$ npm config set package-lock false --location=project
$ npm config set @fortawesome:registry=https://npm.fontawesome.com/ --location=project
환경 변수로 설정
npm은 환경 변수를 통해서도 설정이 가능하며 환경 변수를 사용하면 범위에 무관하게 npmrc 파일에 명시된 설정보다 우선합니다.
npm 설정을 위한 환경 변수는 npm_config_
로 시작해야하며, 키에 사용된 하이픈(-
)을 모두 언더바(_
)로 바꿔줘야 합니다.
예를 들어, package-lock
옵션을 환경 변수를 통해서 true
로 설정해보겠습니다.
$ export npm_config_package_lock=true
이렇게 해주면 위에서 npm config set
명령어를 통해서 사용자 범위와 프로젝트 범위에서 false
로 설정한 것이 무시가 될 것입니다.
npm config get
명령어로 정말 그런지 확인해보겠습니다.
$ npm config get package-npm_config_package_lock
true
네 이렇게 예상했던데로 false
대신에 true
가 나오네요.
전체 설정 조회
npm config ls
명령어를 사용하면 지금까지 설정한 모든 내역을 범위별로 한 눈에 확인해볼 수도 있습니다.
$ npm config ls
; "user" config from /Users/daleseo/.npmrc
; @fortawesome:registry = "https://npm.fontawesome.com/" ; overridden by project
https-proxy = "http://proxy.company.com:8080/"
; package-lock = false ; overridden by env
proxy = "http://proxy.company.com:8080/"
strict-ssl = false
; "project" config from /Users/daleseo/work/daleseo/.npmrc
@fortawesome:registry = "https://npm.fontawesome.com/"
; package-lock = false ; overridden by env
; "env" config from environment
package-lock = true
; node bin location = /Users/daleseo/.nvm/versions/node/v16.13.0/bin/node
; cwd = /Users/daleseo/work/daleseo
; HOME = /Users/daleseo
; Run `npm config ls -l` to show all defaults.
;
는 npm config ls
결과에서 주석 처리를 의미하므로 없는 ;
로 시작하는 줄은 무시해도 무방합니다.
일반적으로 낮은 범위에서 설정된 옵션이 높은 범위에서 재설정되면 우선순위에 따라 낮은 범위의 설정 값은 덮어쓰기(overridden)가 됩니다.
예를 들어, @fortawesome:registry
옵션은 프로젝트 범위에서 재설정되었으므로 사용자 범위에서 주석 처리되었습니다.
또한, package-lock
옵션은 환경변수로 재설정되었으므로 프로젝트 범위와 사용자 범위에서 주석 처리가 된 것을 볼 수 있습니다.
설정 삭제
npm config delete {키}
명령어를 사용하면 설정되어 있는 옵션을 삭제할 수 있습니다.
$ npm config delete proxy
$ npm config delete https-proxy
$ npm config delete strict-ssl
정말 잘 삭제되었는지 npm config get
명령어를 통해서 확인해보겠습니다.
$ npm config get proxy https-proxy strict-ssl
proxy=null
https-proxy=null
strict-ssl=true
이렇게 npm config get
명령어는 여러 개의 옵션 키를 동시에 넘길 수도 있습니다.
마치면서
이상으로 npm에서 설정을 보관하는 npmrc 파일과 npm config
커맨드를 통해서 npmrc 파일을 관리하는 방법에 대해서 살펴보았습니다.
npm에서 설정이 가능한 모든 옵션은 공식 레퍼런스를 참고 바라겠습니다.