본문 바로가기

Frontend/Javascript

package.json vs package.lock.json

git에서 pull을 받거나 할때 package.lock.json 때문에 충돌이 나서 안되는 경우가 있다고 한다. 

 

패키지 관리 

package.json을 통해서 패키지 버전 관리를 한다. 

npm install을 하게 되면 package.json에 포함된 의존성 패키지들이 npm registry로부터 다운받아져 설치가 되고 node_modules 폴더에 저장이 된다.

 

package.lock.json 파일이 필요한 이유 

해당 프로젝트를 진행하는 모든 개발자가 동일한 package.json을 바라보고 있기 때문에 패키지를 설치하면 모두가 동일한 버전의 패키지를 설치하지 않을까?하지만 그렇지 않다. package.json에 명시한 버전들이 ~ (틸드), ^(캐럿)으로 인해 버전의 범위가 달라지기 때문이다. 

 

예시 

나의 package.json 파일 

"dependencies": {
        "@ethereumjs/util": "^8.0.3",
        "@metamask/eth-sig-util": "^5.0.2",
        "@nestjs/common": "^9.0.0",
        "@nestjs/config": "^2.3.1",
        "@nestjs/core": "^9.0.0",
....

다른 팀원의 package.json 파일 

 "dependencies": {
    "@ethereumjs/util": "^8.0.5",
    "@js-joda/core": "^5.5.2",
    "@metamask/eth-sig-util": "^5.0.2",
    "@nestjs/axios": "^2.0.0",
    "@nestjs/common": "^9.3.12",
    "@nestjs/config": "^2.3.1",
    "@nestjs/core": "^9.3.12",
    ...

이렇게만 봤을때도 버전의 미세한 차이가 있음을 알 수 있다. 

 

또한, "@nestjs/core":"^9.0.0"이라고 했을 때 캐럿의 범위는 9.0.0 이상 10.0.0 미만의 최신 버전을 적용한다. 

하나의 package.json 파일로 버전을 관리하는데 패키지를 명시하는 캐럿(~), 틸드(^)에 의해서 버전 범위가 존재하게 되고,

특정 시점에 가장 최신 버전으로 설치되는것이 문제이다. 

 

-> 그래서 package.lock.json 파일을 만들어서 최초의 프로젝트를 initializing 했을때의 해당 버전으로 고정하고 원격 저장소에 푸시한다. lock 파일은 .gitignore에 포함되어 있으면 안되고, 반드시 포함시켜 git에서 팀원간 공유할 수 있도록 remote에 올려야 한다. 

 

나머지 개발자들은 package.json과 lock파일(yarn.lock 또는 package-lock.json)을 pull 받아서 패키지를 설치할 때 최신버전이 아니라 lock 파일에 정의되어있는 해당 버전으로 설치를 진행하게 되는데, lock 파일을 통해서 모든 개발자는 동일하게 버전 사용이 가능하다. 

 

참고 

https://umanking.github.io/2022/05/05/yarn-lock/