Programming/Web
(번역) `npm ci`와 `npm install`의 차이점
은정 Rachel
2023. 11. 9. 00:54
팀에서 yarn과 pnpm을 주로 쓰게 되면서 npm을 잘 안 쓰게 되었는데, npm을 사용했던 예전 프로젝트에 작업할 일이 생겼다.
당연하게도 npm install
를 한 후에 개발 서버를 띄우려고 했는데... 의존성이 깨졌는지 터미널이 오류로 난리가 났더랬다. (package-lock.json
파일도 수정되었다.) 이것저것 삭제하고, 다시 설치해보고... 한참을 낑낑댔는데, 정말 허무하게도 npm ci
라는 명령어로 간단하게 해결이 가능했다.
혹시나 위 경우처럼 npm install
을 했을 때 package-lock.json
이 새로 생기면서 의존성이 깨지고, 최악의 경우 개발 서버를 실행조차 할 수 없다면 아래 글을 읽어보도록 하자.
npm은 Node.js 프로젝트의 기본 패키지 관리자입니다.
프로젝트가 npm 기반인 경우 종속성을 설치하려면 npm install
또는 npm i
를 사용해야 합니다.
이제 npm v6에 새로운 명령이 출시되었습니다. - npm ci
npm ci
명령은 테스트 플랫폼, 지속적 통합(CI) 및 배포(CD)와 같은 자동화 환경 또는 종속 요소를 새로 설치하려는 상황에서 사용한다는 점을 제외하면 npm install
과 유사합니다.
다음과 같은 경우, npm ci
가 훨씬 더 빠릅니다:
package-lock.json
또는npm-shrinkwrap.json
파일이 있습니다.node_modules
폴더가 없거나 비어 있습니다.
npm install
또는 npm i
의 동작
- 모든 종속성을 설치합니다.
- 종속성 버전을 지정할 때
^
또는~
를 사용하면 npm이 지정한 정확한 버전을 설치하지 않을 수 있습니다. - 새 종속성을 설치할 때와 같이 변경 사항이 있을 때
npm install
은package-lock.json
을 업데이트할 수 있습니다.
npm ci
와 npm i
의 다른 점
- 반드시 프로젝트에 기존
package-lock.json
또는npm-shrinkwrap.json
이 있어야 합니다. package-lock.json
또는npm-shrinkwrap.json
의 종속성이package.json
의 종속성과 일치하지 않으면npm ci
가 오류와 함께 종료됩니다. json 파일은 수정되지 않습니다.npm ci
는 한 번에 전체 프로젝트만 설치할 수 있으며, 개별 종속성은 이 명령으로 추가할 수 없습니다.node_modules
가 이미 있는 경우,npm ci
가 설치를 시작하기 전에 자동으로 제거합니다.package.json
이나package-lock.json
/npm-shrinkwrap.json
을 절대 생성/수정하지 않습니다. 설치는 기본적으로 동결됩니다.- 깨끗한 상태를 유지하기 위해
node_modules
폴더를 삭제합니다. - 모든 종속성을 정확한 버전으로 설치하기 위해
package-lock.json
을 사용합니다. npm install
과 달리,npm ci
는package-lock.json
을 수정하지 않습니다.
언제 어떤 것을 사용해야 할까? (이미 npm v6를 업데이트한 경우)
npm install
: 새 종속성을 설치하거나 기존 종속성을 업데이트(예: 버전 1에서 버전 2로 이동)하는 경우npm ci
: 지속적 통합에서 실행하거나package-lock.json
을 수정하지 않고 종속 요소를 설치하려는 경우
정리하자면,
package.json
에서^
또는~
을 사용한 의존성의 경우,npm install
은 정확한 버전을 설치하지 않을 수 있다.- 이 경우,
package-lock.json
도 함께 수정된다. - (대부분은 마이너 업데이트만 할 테지만) 의존성이 깨질 가능성이 있는 것이다.
- CI/CD 환경이거나,
- 또는 그 환경이 아니더라도,
- 버전을 올릴 필요가 없고,
- 즉,
package-lock.json
을 수정하고 싶지 않고, - 오래되어 더 이상 관리가 안되는 프로젝트거나,
- 어쨌든 의존성이 깨지는 상황이라면,
package-lock.json
에 명시된 버전만을 설치하는npm ci
을 사용하면 된다.