javascript

npm install과 npm ci 의 차이

npmci

지인과 개발을 하던 도중 프로젝트에서 알게 된 사실이다

프로젝트 초기 설정시나 실서버에 배포할때 package.json 파일과 package-lock.json 파일이 존재할 경우

npm install 명령어를 입력할때 package-lock.json 파일이 존재하므로 항상 동일한 패키지 버전을 설치해주며

package-lock.json 파일은 변경이 일어나지 않는것이라고 생각했다

그러나 package-lock.json파일이 존재해도 npm install 명령어로 인해서

package-lock.json의 변경이 일어나는 경우가 있으며

다른 버전의 package가 설치될수있다는것을 알았다

이를 방지하기 위해서 npm ci라는 명령어가 존재한다는것을 알게되었다

package-lock.json이 변경되는 경우

  1. npm 매니저의 버전이 낮은 경우 → 패키지의 변경은 없음

  2. package.json파일이 변경되는 경우 → 패키지의 변경이 존재함

  3. node_modules의 정보와 일치하지 않는 경우 → 패키지의 변경이 존재

문제가 되는건 패키지의 변경이 일어나는 경우다

2번의 경우에 대해서 설명하자면 package.json의 정보를 직접 입력하여서 변경하는 경우 발생할수있다

또한 npm install <패키지명>으로도 패키지를 추가하는 경우 package-lock.json에 내용이 추가되거나 수정될수있다

3번같은 경우는 node_modules에 저장된 내용이 package.json과 package-lock.json에 일치하지 않으면 자동으로 패키지의 변경이 일어난다

npm ci를 사용하는 이유

package.json과 package-lock.json이 존재해도 패키지를 설치할때 버전 변경이 일어날수있다

그런데 npm ci를 사용할 경우 이러한 버전 변경이 일어나는것을 막을수있다

또한 설치전에 기존 node_modules폴더를 삭제하기때문에 node_modules때문에 발생하는 패키지변경을 방지한다

npm ci는 강제적으로 package-lock.json대로 설치하며 아래의 경우 에러를 발생시킨다

  • package-lock.json 파일이 존재하지 않는 경우

  • package-lock.json 파일의 버전과 package.json의 종속성이 일치하지 않는 경우

아래의 상황에서 npm ci를 사용하는것을 권장

  • 원격저장소에서 받은 프로젝트를 초기설정할때

  • 실제 서버에 배포하거나 빌드하는 경우에


참조

npm i와 npm ci의 차이