npm i, npm ci 뭐가 다를까?
package.json 파일이란?
package.json 파일은 노드(node.js)의 현재 프로젝트에 관한 정보를 저장한다.
저장 위치는 프로젝트의 루트 디렉토리이며, 사용하고 있는 패키지들의 명세나 애플리케이션 종속성, 프로젝트의 정보 등을 정의하는 파일이다.
이 파일은 새 프로젝트를 시작하는 npm init 과정에서 자동으로 생성되므로 직접 만들 필요는 없다.
npm에서 의존성(dependencies)이란 해당 프로젝트가 돌아가기 위해 필요한 npm 패키지들을 의미한다.
그렇다면 package-lock.json 파일은 무엇인가?
package.json 파일에서는 어떤 모듈의 특정 버전을 사용하겠다고 정확히 명시할 수도 있지만,
여러가지 기호(>, <, >=, ^, ~)를 사용하여 범위를 명시해주는 것 또한 가능하다.
따라서 package.json 파일에 어떤 패키지가 "express": "~1.14.1" 이라고 작성되어 있다면,
이는 1.14.1버전 이상부터 1.15.0 미만의 패키지를 사용할 것이라는 의미와 같다.
그렇기 때문에 같은 프로젝트를 개발하는 사람끼리라고 해도,
어떤 개발자는 1.14.1 버전을 사용하고 또 어떤 개발자는 1.14.2 버전을 사용하고 있을 수도 있다는 것이다.
이러한 모듈의 버전차이는 알 수 없는 버그를 유발할 수 있다.
이러한 문제를 해결하기 위해 package-lock.json 파일이 생겨난 것이다.
package-lock.json 파일은 package.json 파일에 틸드(~)로 명시되어있는 모듈들의 버전이 정확히 명시되어있어,
정확한 버전의 패키지를 설치할 수 있도록 도와준다.
npm i(=npm install) 작동 방식
1. package.json를 읽고 종속성 목록을 작성함
2. package-lock.json를 사용하여 설치할 버전을 알려줌
3. 만약 종속성이 package-lock.json에 없으면 npm install에 의해 추가
정리 package.json내의 dependencies와 devDependencies를 기준으로 패키지 파일을 설치한다.
즉, package.json 을 읽어 의존성 목록을 만들고 package-lock.json 을 통해 설치할 의존성의 버전을 알려주는 것이다.
npm ci (Continuous Integration)작동 방식
1. npm ci는 먼저 node_modules를 삭제하고, package-lock.json에서 직접 종속성을 한 번에 설치함
(👉따라서 기존 package-lock.json 파일이 존재해야 함)
2. package.json를 사용하여 일치하지 않는 버전이 없는지 확인
3. 만약 package.json과 package-lock.json 내의 버전이 다르면 package-lock.json을 기준으로 package.json 파일을 수정
4. 종속성이 없거나 호환되지 않는 버전이 있으면 오류가 발생
정리 package.json보다 package-lock.json을 우선시하여 패키지 파일을 설치한다.
npm ci에서 package.json 은 버전이 매칭되는지 확인하는 용도로 사용한다.
npm ci를 사용하는 것의 장점
- npm install을 사용하는 것보다 약 2배 빠름 (특히 CI/CD가 잦은 조직에서 성능 향상)
(👉이미 버전이 정확하게 명시된 것을 기반으로 동작하기 때문에 설치 버전을 알아내야하는 npm install 보다는 빠르다. 다만, npm ci에서는 node_modules를 지우는 과정이 포함되기 때문에 해당 연산이 길어진다면 npm i보다 느린 경우도 존재할 수 있다)
- 명시되지 않은 부분에 대해서는 오류를 발생시키므로 어플리케이션 관리에 있어 안정성 확보
'한 걸음 > TS & JS' 카테고리의 다른 글
[Node.js] http 요청 라이브러리 (axios) (0) | 2022.04.07 |
---|---|
[Node.js] 간단한 크롤러 만들기 (feat.네이버 영화순위) (0) | 2022.04.07 |
Javascript Event Loop & Promise (0) | 2021.08.22 |
8. IIFE (Immediately-Invoked Function Expressions) (0) | 2020.04.26 |
7. 표현식과 명령문(Expression vs Statement) (0) | 2020.04.19 |