npm i, npm ci 뭐가 다를까?

2022. 1. 16. 18:19
반응형

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보다 느린 경우도 존재할 수 있다)

 

-  명시되지 않은 부분에 대해서는 오류를 발생시키므로 어플리케이션 관리에 있어 안정성 확보

 

반응형

BELATED ARTICLES

more