이번 포스팅은 npm install 과 npm ci 명령어를 비교해봅니다. 두 명령어 모두 의존성 목록을 설치하는 것이지만, 서로 다른 방향을 가집니다.

둘 사이의 차이점을 이해하면 유용하게 사용할 수 있을 것입니다.

(다른 패키지 매니저(yarn)가 아닌 npm을 기준으로 다룹니다.)

패키지 버전 관리 파일

package.json

package-lock.json

먼저 두 파일을 간단하게 살펴봅시다. package.json은 우리가 설치하고자 하는 모듈에 대한 의존성 목록이 존재합니다. 여기서 의존성 목록의 버전은 version range 를 따르고 있습니다. (~, ^, ≤, 등)

# package.json

"react": "^17.0.2",
"safer-buffer": ">= 2.1.2 < 3.0.0",
"es6-iterator": "~2.0.3"

version range로 인해 발생할 수 있는 이슈는 각자 서로 다른 버전의 node_modules를 생성할 수 있다는 것입니다.

예를 들어, 하나의 프로젝트에 여러 명의 개발자가 협업을 할 경우를 보자면 각자의 로컬 환경에서 npm, node 버전 등이 서로 다를 수 있습니다. 이러한 상황에서 각자 npm install 을 실행한다면 서로 다른 버전을 가지는 모듈을 가지는 경우가 생길 수 있습니다.

이러한 이슈는 로컬 환경뿐만 아니라 CI/CD 등 서로 다른 환경에 의해 발생할 수 있습니다.

그래서 package-lock.json 이 존재하는 것입니다. package-lock.json 은 version range 와는 다르게 정확하게 버전이 명시되어 있습니다.

# package-lock.json

"@babel/parser": {
  "version": "7.16.7",
  "resolved": "<https://registry.npmjs.org/@babel/parser/-/parser-7.16.7.tgz>",
  "integrity": "sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA==",
  "dev": true
}

위 처럼 version range 가 아닌 정확하게 명시된 버전을 모두가 바라보게 된다면 결국 모두 같은 버전의 의존성을 가지게 됩니다. 이러한 이유로 package-lock.json 을 같이 커밋해서 사용하고 있는 것입니다.