우연히 이 둘의 차이점을 보게 되서 이에 대한 글을 쓰고자 한다.
npm install을 할 때 밑의 두 파일을 기반으로 설치를 하게 된다.
- package.json
- package-lock.json
package.json 은 우리가 설치하고자 하는 모듈에 대한 의존성 목록이 존재한다. 여기서 의존성 목록의 버전은 version range를 따르고 있다. (~, ^ <=, etc)
"react": "^17.0.2"
version range로 인해 발생할 수 있는 이슈는 각자 서로 다른 node_modules 를 생성할 수 있다.
예를 들어, 하나의 프로젝트에 여러 명의 개발자가 협업을 할 경우에 각자의 로컬 환경에 따라 npm, node 버전 등이 다르다. 이러한 상황에서 각자 npm install 실행한다면, 서로 다른 버전을 가지는 모듈을 가지는 경우가 생길 수 있다. 이러한 이슈는 로컬 환경뿐만 아니라 CI/CD 등 서로 다른 환경에 의해 발생할 수 있다.
그래서 package-lock.json 이 존재한다. package-lock.json은 version range 와는 다르게 정확하게 버전이 명시되어 있다.
react@^17.0.2:
version "17.0.2"
위처럼 version range가 아닌 정확하게 명시된 버전이 있다면, 결국 모두 같은 버전의 의존성을 가지게 된다. 이러한 이유로 package-lock.json을 같이 커밋해서 사용한다.
⚠️ package.json 을 읽어 의존성 목록을 만들고 package-lock.json 을 통해 설치할 의존성의 버전을 알려주는 것이다.
npm install
npm 패키지를 설치하기 위해서 가장 많이 사용되는 명령어이다. 대표적으로 두가지 방법으로 사용한다.
1) 특정 패키지 설치하기
npm install react
npm install 명령어 뒤에 설치하려는 패키지명을 넣어서 패키지를 설치한다.
2) 프로젝트에 있는 모든 패키지 설치하기
npm install
package.json에 명시된 모든 패키지를 설치한다.
npm ci
npm ci는 clean-install의 줄임말로, package-lock.json 파일을 필요로 한다. package.json과 버전이 매칭이 되는지 검사하여 package-lock.json 파일을 기반으로 패키지들을 node_modules에 설치한다.
패키지 버전 범위에서 설치해야 하는 버전을 알아내는 연산이 있는 npm install과 비교해서 해당 연산이 없기 때문에 더 빠른 속도로 설치가 가능하다.
그러나, 단점도 존재한다. npm ci는 node_modules가 존재하면 이를 삭제하고 재 설치해야 한다. 이는 일관성 있는 패키지 설치 환경을 보장하고, 깨끗한 상태에서 시작한다. 만약 node_modules가 존재하고 이를 삭제해야 하는 경우라면 시간이 더 오래 걸리게 되어, npm install보다 느릴 수 있다.
CI 환경에서 해당 명령어를 사용하면 시간을 단축시킬 수 있을 것이다.
👇🏻 참고 사이트
https://mygumi.tistory.com/409