개발/기타

package-lock.json을 알아보자

JonghwanWon 2022. 7. 1. 02:10

프로젝트 진행 간 아래와 같은 문제가 발생한 경험이 있나요?

1. 같은 커밋에 위치했는데 A 개발자는 프로그램이 문제없이 동작하고, B 개발자는 프로그램이 에러가 발생한다.
2. 변경사항을 pull 받고 install 했더니 코드의 변경사항은 없는데 package-lock.json파일의 변경사항이 있다.

너무나 익숙하지만 어떤일을 하는 녀석인지 대부분 모르고 지나가는 package-lock.json에 대해서 내용을 정리해 글을 작성합니다.

package.json 그리고 package-lock.json

기본적으로 package.json은 npm에 패키지를 배포하기 위해 반드시 필요한 "문서"입니다.
또한 프로젝트의 의존성 관리를 위한 명세라 할 수 있습니다.

npm 버전 5 이상에서 npm install을 실행 시 package-lock.json파일이 생성됩니다.
package-lock.json파일의 목표는 프로젝트 내 설치된 모든 package의 정확한 버전을 추적하여 유지하는 데에 있습니다.
즉, 동일한 방식으로 프로젝트를 100% 재현할 수 있도록 돕습니다.

일반적으로 package.json에서 semver 표기법을 사용해 업그레이드 버전을 설정할 수 있습니다.
예를들어 버전을 "~2.0.0"으로 설정한다면 patch 릴리즈(2.0.1, 2.0.2 등)만 업데이트합니다.
"^2.1.0"으로 설정한다면 어떻게 될까요?
이때에는 patch와 minor릴리즈를 업데이트하려고 합니다.
또는 정확하게 "2.0.0"으로 고정된 버전을 사용할 수도 있습니다.

일반적으로 우리가 많이 사용하는 형상관리 시스템 git을 통해 node_modules를 커밋하지 않습니다.
누군가가 프로젝트를 clone해 프로젝트 내 설치된 package들을 install 할 때 앞서 설명한 semver 표기법에 따라 패치 및 마이너버전을 업데이트하며 설치하게 되기에 다른 시스템과의 package-lock.json 파일의 차이가 발생하게 됩니다.
일반적으로 patch, minor 릴리즈는 주요 변경사항이 아니지만 이는 단정 지을 수 없죠. 또한 이 릴리즈에 버그가 포함되어 있을지도(혹은 이 릴리즈에서 버그가 해결되었을 수도) 모릅니다.
따라서, 원래의 프로젝트와 새로 초기화 된 프로젝트는 다른 부분이 생길 가능성이 있습니다.

그렇다면, 어떻게 여러 개발자가 다른 시스템에서 같은 버전의 package들을 정확히 사용할 수 있을까요?

npm ci vs npm install

npm install은 package.json 종속성의 업데이트를 확인하며 설치합니다.
npm ci는 node_modules폴더를 삭제하고 package-lock.json 파일에 명시된 버전을 정확히 사용하여 설치합니다.

npm update <package name>는 해당 package를 설정된 표기법에 따라 사용 가능한 버전으로 업데이트합니다.

만약, 프로젝트가 제대로 실행되지 않는다고 node_modules를 지우고 package-lock.json을 지우고 npm install으로 패키지들을 설치해보는 방법을 사용하고 있다면 여전히 문제가 존재할 수 있다는 것을 인지하고 있어야 합니다.

package-lock.json은 다른 코드들과 마찬가지로 형상이 유지되고 관리되어야 하는 또 하나의 문서입니다.