본문 바로가기

IT 개발자의 창고

npm install vs ci

npm을 통해 node-module을 설치할 때 사용하는 명령어로 npm install 과 npm ci 가 있다.

둘 다 npm node-module을 설치하는 명령어이지만, 서로 다른 차이점이 있다.

 

npm 설치 명령어는 package.json 과 package-lock.json 파일과 밀접한 연관 관계가 존재한다.

 

먼저 package.json은 설치하고자 하는 모듈의 의존성 목록을 정의하며, 각 module의 version은 version range를 따른다.

이 때 version은 다음과 같이 사용 가능한 범위를 지정할 수 있다.

참고) https://docs.npmjs.com/cli/v6/using-npm/semver#ranges

 

semver | npm Docs

The semantic versioner for npm

docs.npmjs.com

 

반면, package-lock.json은 설치된 node-module의 정확한 version을 명시한다.

"devDependencies": {
  "fbr": "latest",
  "fs": "0.0.1-security",
  "https": "^1.0.0",
  "node-static": "^0.7.11"
}

 

package.json과 package-lock.json이 어떻게 다른지를 알았으니, 이제 npm install 과 npm ci가 어떻게 다른 지 비교해보자.

 

npm install
- package.json을 읽어 dependency list를 만들고, package-lock.json을 생성하여 실제 설치할 dependency version을 명시한다.

 

npm ci
- package-lock.json이 무조건 존재해야 한다.
- package-lock.json 파일에 명시된 version으로 node module을 설치하고, package.json을 해당 version이 유효한지를 체크하는 목적으로 사용한다.
- 위 2가지 조건이 맞지 않는 경우 npm ci는 실행되지 않는다.
- 실행 시 기존 node-module을 삭제 후 재설치 한다.

 

그래서, npm install을 실행 시 package.json 파일만 있으면 되고, package-lock.json은 그 결과로 생성된다.

그러나, npm ci를 실행할 경우에는 package.json 과 package-lock.json 파일 모두 존재해야 한다.

 

요즘 같이 하나의 프로젝트에 여러 명의 개발자들이 협업하는 경우에 node module의 version을 일치시키는 것은 매우 중요한 이슈이다.

이를 위해 npm ci가 더 효율적으로 다가올 수 있다. 또한, npm ci는 명확한 version이 지정되어 있어 설치 자체도 매우 빠르다. (물론 package.json에 명확한 version을 정의하고, npm install을 사용해도 된다.)

하지만, npm ci는 기존 node module을 모두 삭제 후 재설치 하기 때문에 이런 점은 단점이 될 수 있다.