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 파일을 사용하여 정확한 버전을 사용하여 패키지를 설치할 수 있다.