Node.js로 개발하다보면 npm으로 외부 라이브러리를 쓰게 마련인데, 외부 라이브러리의 버전 문제가 서비스 운영에 차질을 가져올 수도 있다.
package.json에서는 보통 의존하는 라이브러리의 버전을 하나로 확정 짓지 않고 ^
와 ~
등을 사용해서 하위 호환성이 보장되는 선에서 의존하는 라이브러리의 최신 버전을 npm install
을 통해 새로 받아서 사용한다.
우리가 스스로 작성한 package.json 뿐아니라 가져다 쓰는 외부 라이브러리의 package.json 파일도 ^
와 ~
등을 사용하므로, 사실상 라이브러리 버전 관리는 우리의 제어권을 벗어나버린다.
그리고 제어권 밖의 어느 지점에서 우리 환경과 맞지 않는 라이브러리가 출현하면 npm install
은 실패하고 서비스 운영에 차질이 생긴다.
어느 시점 이후로는 npm install을 금지해서 라이브러리 버전이 바뀌는 것을 원천적으로 막는 하드코어한 방식으로 깔끔하게 이 문제를 해결할 수도 있지만, 보다 소프트코어한 해결 방식도 있다.
바로 npm shrinkwrap
인데, 한 마디로 현재 설치된 라이브러리 버전을 기준으로 package.json 보다 우선 순위가 더 높은 npm-shrinkwrap.json을 생성해서 이 파일을 기준으로 npm install
을 실행하는 것이다.