(번역) `npm ci`와 `npm install`의 차이점

2023. 11. 9. 00:54Programming/Web

팀에서 yarnpnpm을 주로 쓰게 되면서 npm을 잘 안 쓰게 되었는데, npm을 사용했던 예전 프로젝트에 작업할 일이 생겼다.
당연하게도 npm install를 한 후에 개발 서버를 띄우려고 했는데... 의존성이 깨졌는지 터미널이 오류로 난리가 났더랬다. (package-lock.json 파일도 수정되었다.) 이것저것 삭제하고, 다시 설치해보고... 한참을 낑낑댔는데, 정말 허무하게도 npm ci라는 명령어로 간단하게 해결이 가능했다.
혹시나 위 경우처럼 npm install을 했을 때 package-lock.json이 새로 생기면서 의존성이 깨지고, 최악의 경우 개발 서버를 실행조차 할 수 없다면 아래 글을 읽어보도록 하자.

 


 

원본: https://medium.com/@bansal.suneet/npm-ci-command-only-refer-package-lock-json-to-install-dependencies-ci-cd-8472041a450d

 

npm ci command | only refer package-lock.json to install dependencies | ci/cd

npm is the default package manager for Node.js projects.

medium.com

 

 

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 installpackage-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 cipackage-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을 사용하면 된다.