본문 바로가기
개발/NestJS

npm install vs npm ci

by coking 2022. 9. 21.

본 글에 들어가기 앞서 내가 npm install과 npm ci를 알아보게 된 이유는 ci 서버에서 한 번씩 수정이 발생해서 git pull이 되지 않는 문제를 발생했기 때문이다..

npm(Node Package Manager)이란??

npm은 말 그대로 노드 패키지를 관리해주는 틀이다. 이로 인해 개발자는 단 몇 줄의 명령어로 기존에 공개된 모듈(패키지)들을 설치하고 활용할 수 있다.

npm install이란??

npm install [<패키지 사양> ...]

특정 패키지 설치할 경우

npm install

특정 패키지 명을 명시하지 않을 경우에는 package.json에 명시되어있는
모든 의존 패키지를 설치해 node_modules에 적재한다.

두 방식의 공통점

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

 

package.json은 우리가 설치하고자 하는 모듈에 대한 의존성 목록이 존재하는데
여기서 의존성 목록의 버전은 version range를 따르고 있다. (~, ^ <=, etc)

"@nestjs/common":"^8.0.0",

 

version range로 인해 발생할 수 있는 이슈는 각자 서로 다른 node_modules를 생성할 수 있다는 것이다. 개발자 간 협업을 할 경우 각자 로컬 환경에서 npm, node 등 버전 등이 서로 다른 상황에서 npm install을 실행한다면 서로 다른 버전을 가지는 모듈을 가지는 경우가 생길 수 있다. 이러한 이슈는 로컬뿐만 아니라 CI/CD 등 서로 다른 환경에 의해 발생할 수 있다.

 

그래서 package-lock.json이 존재한다. package-lock.jsonversion range와는 다르게 정확하게 버전이 명시되어 있다.

"@nestjs/common": {"version":"8.0.0"}

 

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

 

npm install을 실행하면 package.json에 의존성 목록에 추가될 것이고 package-lock.json도 업데이트 될 것이다. 이것이 의미하는 것은 npm install 명령어는 package.json, package-lock.json에 모두 쓰기 권한을 가진다는 것
반면에 npm ci는 쓰기 권한이 없다,

npm ci(npm clean-install)이란??

  • npm install과는 달리 npm ci는 package-lock.json을 수정하지 않는다.
  • 프로젝트에 package-lock.json 파일이 무조건 있어야 하고, 만약 없으면 에러를 낸다.
  • package-lock.json에서 정확한 버전의 모든 종속성을 설치하고, package.json은 버전 매칭 밸리데이션 용도로 사용한다.
    즉, package-lock.jsonpackage.json 사이의 버전이 매칭이 안되면 에러를 낸다.
  • node_module 폴더를 삭제한 후, 의존성을 한 번에 설치하기에 깨끗한 상태를 보장한다.
  • 이 기능은 jenkins 또는 GitLab CI와 같은 연속 통합 도구에서 실행할 때 유용하다.
  •  

이처럼 npm install과 달리 파일을 손대는 일은 없기에, 쓰기 권한이 없다고 언급한 것이다.
오직 package-lock.json을 읽고 의존성 목록을 설치하게 된다.

이러한 흐름으로써, 개발 환경이 아닌 CI 환경에서는 npm install 보다는 적합한 방안으로 여겨진다.

 

특정 케이스에서는 npm ci가 또 특정 케이스에서는 npm install이 빠르다고 하지만 나 같은 경우에는 node_modules를 같이 커밋하지도 않고, 두 케이스를 비교해봤을 때 소요되는 시간의 차이가 거의 없었기에 좋았고 package-lock.json을 기반으로 의존성을 설치하는 것만으로도 npm ci가 적합하다고 판단된다.

댓글