node

npm] npm i 와 npm ci의 차이점(Feat. package-lock.json과 pacakge.json 의 차이점)

Nerd 2022. 10. 9. 00:04

npm i (npm install)

npm install 은 프로젝트에 패키지를 설치하기 위해 사용하는 명령어입니다.

사용법

필요한 패키지를 설치할 경우 아래와 같은 형식으로 사용합니다.

npm install <설치할 패키지>
or
npm install <설치할 패키지>@latest (최신 버전으로 설치)
or
npm install <설치할 패키지>@버전명 (특정 버전으로 설치)

프로젝트가 의존하고 있는 모든 패키지 설치

npm install

위의 두 가지 방법 모두 package-lock.json을 먼저 확인하고
존재한다면 lockfile을 이용해서 의존하고 있는 패키지 정보를 확인하고
node_moduels에 설치합니다.
만약 node_modulespackage.json에 변화가 생기면
package-lock.json업데이트하여 의존 패키지 정보를 기록합니다.


npm ci (npm clean-install)

사용법

npm ci

npm cipackage-lock.json에 명시되어있는 패키지 정보를 활용해서
정확한 버전의 패키지들을 node_moduels에 설치합니다.
따라서, 협업을 할 때, 팀원들이 동일한 버전의 패키지를 사용하는 것을 보장합니다.

npm i 와 npm ci의 차이점

  • package-lock.json수정하지 않습니다.
  • npm cipackage-lock.json 또는 npm-shrinkwrap.json이 있어야 합니다.
  • pacagke-lock.json의 의존성이 package.json의 의존성과 일치하지 않으면
  • npm cipacakge-lock.json을 업데이트하지 않고 오류와 함께 종료됩니다.
  • npm ci는 한 번에 전체 프로젝트만 설치할 수 있습니다.
  • node_moduels가 이미 있는 경우 npm ci가 설치를 시작하기 전에 자동으로 제거됩니다.
  • npm ci는 쓰기 권한이 없기 때문에 pacakge-lock.json을 수정하지 않습니다.
    오직 package-lock.json을 읽고 의존성 목록을 설치합니다.

package-lock.json

이번 글에서 자주 등장하는 package-lock.json은 무엇일까요?

package-lock.jsonnpmnode_moduels 트리 또는
pacakge.json을 수정하는 모든 작업에 대해 자동 생성됩니다.
의존성 업데이트에 관계없이 후속 설치에서 동일한 트리를 생성할 수 있도록
생성한 정확한 트리를 설명하고
이 파일은 소스 리포지토리에 커밋하기 위한 것이며 다양한 용도로 사용됩니다.

협업 시 pacakge-lock.json 을 사용한다면 아래와 같은 과정을 거칠 수 있습니다.

  1. node_modules 폴더를 제외하고 package.jsonpackage-lock.json 파일을 커밋합니다.
  2. 팀원은 소스코드를 받은 후 npm install 또는 npm ci를 실행합니다.
  3. 의존성 트리가 처음 세팅한 환경과 동일하게 설치됩니다.

위의 과정을 거치면 팀원들이 동일한 버전의 패키지를 사용할 수 있게 됩니다.

pacakge.json과 package-lock.json의 차이점

  • pacakge.json은 버전 정보를 저장할 때 version range로 명시되어있습니다.
    • ex ) "react": "~17.0.1"
  • package-lock.json은 버전명이 정확히 명시되어 있습니다.

참고

npm ci : npm ci 공식문서
pacakge-lcok.json : package-lock.json 공식문서