패키지 잠금이란?

2023년 09월 12일

프로젝트에서 npm을 이용해 패키지를 설치하다보면 처음에는 없었던 package-lock.json이 생성된다. package.json에 패키지 정보가 있으니까 필요없는 거 아냐?라고 생각할 수 있지만 package-lock.json은 중요한 역할을 한다.

package-lock.json 역할

package-lock.json 파일은 왜 필요할까?

한마디로 하자면 ‘정확한 버전을 기록해서 같은 프로젝트를 구동하는 여러 환경에서 동일한 버전의 패키지를 사용하기 위함’ 이라고 할 수 있다.

package.json의 한계

package.json파일에는 종종 패키지의 버전에 ^ ~가 붙어 패키지의 한개의 버전이 아닌 버전 범위가 기록된다.

예를 들어 npm i axios 라는 명령어로 axios 패키지를 설치하면, package.json 파일에 이렇게 기록된다.

"dependencies": {
    "axios": "^1.2.4"
  }

^1.2.4: 1.2.4이상 2.0 버전 미만이라는 의미이기 때문에, 이후에 axios의 새로운 버전이 나오고, 그 상태에서 package.json을 기준으로 설치하다 보면 1.6.0 1.7.0 등 다른 버전이 설치될 수 있다.

개발자A, 개발자B가 같은 package.json파일을 기준으로 설치하더라도 시간차에 따라 서로 다른 버전의 패키지를 설치할 수 있게 되는 것이다. 마찬가지로 개발 환경, 운영 환경에서 서로 다른 버전으로 설치될 수 있다.

같은 프로젝트가 다른 환경에서 다른 버전의 패키지가 설치되면 버전에 따라 되던 기능이 안될 수도 있고, 같은 코드임에도 한 환경에서 잘 실행되던 코드가 다른 환경에서는 실행이 안되기도 한다. 디버깅할 때도 힘들겠지 (이마짚)

package-lock.json 자세히 알아보기

npm i axios@1.2.41.2.4 버전을 설치해보자.

npm ls 명령어로 설치된 패키지의 버전을 확인해보면 이렇게 나온다.

└── axios@1.2.4

case1 : package-lock.json이 없을 때

  • 패키지가 저장된 node_modules 폴더, package-lock.json 을 각각 삭제한 후
  • npm i 로 패키지를 설치해보자
  • npm ls 명령어로 설치된 패키지의 버전을 확인해보면
  • └── axios@1.5.0
  • 처음과 다르게 1.5.0 버전이 설치되었다.

case2 : package-lock.json이 있을 때

  • (case1 이전 상태로 만들기 위해 npm rm axios 한 후에 다시 예제의 처음처럼 npm i axios@1.2.41.2.4 버전을 설치
  • 패키지가 저장된 node_modules 폴더를 삭제한 후
  • npm i 로 패키지를 설치해보자
  • npm ls 명령어로 설치된 패키지의 버전을 확인해보면
  • └── axios@1.2.4
  • 처음과 동일한 1.2.4 버전이 설치되었다.

package-lock.json은 설치되는 시점의 버전을 고정하고 그 내용을 저장한다. 이렇게

...
"node_modules/axios": {
  "version": "1.2.4",
	...
},

package-lock.json을 빼먹으면 안돼

그렇기에 공동으로 작업하는 경우 package-lock.json 파일도 공동으로 작업하는 사람들과 공유해야한다. 처음 프로젝트를 시작하는 사람이 package-lock.json파일을 포함된 채로 프로젝트를 공유하는 것이 좋다. 또한 중간에 패키지를 추가, 제거한 경우에도 반드시 package-lock.json을 같이 커밋해야한다.

관련글


TAGS
NPMNODE.JS