지인과 개발을 하던 도중 프로젝트에서 알게 된 사실이다
프로젝트 초기 설정시나 실서버에 배포할때 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를 사용하는것을 권장
- 원격저장소에서 받은 프로젝트를 초기설정할때
- 실제 서버에 배포하거나 빌드하는 경우에
참조