npm init -y를 통해 이니셜라이즈를 하게되면 package.json파일이 생성되고, 이후 다른 npm을 통한 라이브러리 설치시 package.lock.json파일 생성과 더불어 package.json파일이 업데이트 된다.
우리가 직접만들지 않은 이 두파일은 무엇일까??
두 파일 모두 node.js 프로젝트에서 중요정보를 담고있는 파일이다.
이 파일은 프로젝트의 정보, 의존성 패키지 정보, 스크립트 명령어 등을 포함하는 메타데이터 파일이다.
package.json 파일이 담고 있는 정보는 아래와 같다.
name: 프로젝트 이름
version: 프로젝트 버전
dependencies: 프로젝트가 의존하는 패키지들의 목록
devDependencies: 개발 환경에서만 필요한 패키지들의 목록
scripts: 프로젝트에서 사용할 수 있는 스크립트 명령어들의 목록
우리가 자주 접해서 보면 npm을 통한 패키지들의 이름과 버전항목이 주로 많이 들어있는 것을 알 수 있다.
이 파일은 package.json의 의존성 패키지들을 잠금(lock)하는 파일이다. 즉, 이 파일은 의존성 패키지들의 정확한 버전과 의존성 관계를 나타낸다.
npm이 패키지들을 설치할 때 사용되며, 이전에 사용된 버전을 재사용하여 설치를 빠르게 수행할 수 있다.
주목해야할 점은 이전에 사용된 버전을 재사용할 수 있도록 도와준다는 것이다.
package.json파일에서 직접 보면 라이브러리의 이름과 버젼 정보만 나와있지만, lock.json파일은 훨씬 많고 방대한 정보를 가지고 있다.
직접 파일을 열어 보아도 수천줄~수만줄의 길이를 가진 파일을 볼 수 있고, 주로 현재 프로젝트에 설치된 패키지들의 정보를 담고있다.
package.lock.json 파일이 담고 있는 정보는 아래와 같다.
name: 패키지 이름
version: 패키지 버전
lockfileVersion: 파일 형식 버전
dependencies: 모든 의존성 패키지의 이름, 버전, 다운로드 URL 및 SHA-1 해시 등의 정보를 포함하는 객체
간단하게 생각하면 내가 or 다른 개발자가 Git에 올라온 프로젝트를 복제하고 nodemodules를 받을 때 참고 되어야할 사항이 이 파일들에 남겨져 있기 때문에
같은 프로젝트를 다른환경에서 추가적인 작업을 하기 위한 포석이라고 볼 수도 있을 것이라 생각한다.
위에 언급한 두 파일과 가장 연관된 명령어이다.
우리가 보통 처음 프로젝트를 만들면서 진행할 때에는 npm i명령어를 사용하고 이후 이루어지는 복제나 배포환경에서의 통합에서 npm ci를 사용한다.
두 명령어에 대해서 자세히 알아보자.
npm i
는 npm install의 축약형으로, package.json 파일에서 의존성 패키지 정보를 읽어들여 패키지를 설치한다.npm i
명령어를 실행할 때마다, package.json 파일에서 최신 버전의 패키지를 찾아 설치하게 된다.
npm ci
는 npm clean-install의 축약형으로, package-lock.json 파일을 사용하여 의존성 패키지를 설치합니다.npm ci
명령어는npm i
와 달리, 항상 package-lock.json 파일에서 패키지 버전을 읽어들여 설치한다. 따라서npm ci
를 사용하면 정확한 패키지 버전을 사용하여 의존성 패키지를 설치할 수 있다.
npm i
는 개발 및 테스트 환경에서 사용되는 명령어이며 package.json 파일에서 패키지 정보를 가져와 최신 버전을 설치하는 반면, npm ci는 프로덕션 환경에서 사용되는 명령어이며, npm ci는 항상 package-lock.json 파일을 사용하여 정확한 버전을 사용하여 패키지를 설치할 수 있다.