본 글에 들어가기 앞서 내가 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_modules나 package.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.json은 version 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.json과 package.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가 적합하다고 판단된다.
'개발 > NestJS' 카테고리의 다른 글
[NestJS] CORS 설정과 주의할 점(preflight) (0) | 2022.11.26 |
---|---|
[NestJs] 순환 종속성(Circular Dependency) 에러 (0) | 2022.10.23 |
TypeError: Class extends value undefined is not a constructor or null (0) | 2022.09.27 |
[NestJS] Naver SMS 인증 서버 구현 (0) | 2022.08.23 |
[NestJs] Serialization! (0) | 2022.07.16 |
댓글