npm install은 package.json에 있는 dependency가 있는 library들을 다운받는 명령어 이다.
package.json은 dependency version을 ^를 이용하여 다운로드 한다.
이 때, ^는 어떤 방식으로 구동될까?
다음과 같이, ^1.1.0으로 표기되어 있을 경우에 1.1.0에서 2.0.0의 범위를 가지고 있다고 내포하고 있다.
하지만 0.0.x부터는 miner version을 범위로 치기때문에, 2번째 범위인 ^0.0.1이면 0.0.1 <= version 0.1.0임
이 때, package.json은 범위로 version을 표기하다 보니, 협업하는 과정에 version 오류가 생길 가능성이 있다.
그럼 어떤 방법으로 다음과 같은 issue를 해결할 수 있을까?
바로 npm ci
를 이용해서 해결하는 방법이 있다. npm ci는 package.lock.json을 사용한다.
package.lock.json은 무엇이 다른가?
그것은 version의 범위를 표기하는 package.lock.json과는 달리, version의 정확한 숫자를 제시한다.
다음 사진을 보자.
다음과 같이, 한가지 library를 찝었을 때, 그 library가 의존하는 다른 library도 적혀있고, 그 library의 정확한 version이 제시되어 있다.
그리고 그 library version에 맞는 코드 Url도 제시되어 있다.
다음과 같이 정확한 version으로 다운로드 하는 npm ci
는 version 문제를 발생시키지 않는다.
그리고 npm install
보다 평균적으로 2배, 혹은 그 이상 더 빠르다.
다음은 npm install
의 결과이다.
그 다음은 npm ci
의 결과이다. 2배는 아니더라도, 1.7배정도 빠르다.
하지만 npm ci
는 실행할 경우 node_modules를 항상 삭제하고 다시 실행한다.
npm install과 npm ci를 사용해야 하는 때를 잘 구분하여 사용하자.
p.s 사실 ci는 지속적 통합을 의미하는 ci이고, ci 환경 세팅때 사용하기 위해 만들어 졌다.