본문 바로가기
Web development/Node.js & Typescript

package-lock.json의 역할과 커밋해야 하는 이유

by 자몬다 2020. 4. 3.

npm install시 자동으로 생기는 package-lock.json이 대체 무슨 역할인지 알아보자.

 

package.json은 이 프로젝트 패키지의 정보들을 담고 있다.

이름, 버전 등을 포함하고 있는데, 의존성 모듈 정보도 가지고 있다.

 

{
  "name": "myApp",
  ...
  "dependencies": {
    "express": "^4.16.4",
    ...
  }
}

 

dependencies에는 이 패키지 실행에 필요한 다른 모듈들의 이름과 버전 정보가 명시되어 있다.

그래서 다른 사람이 내 코드를 다운받아 실행하더라도, npm install만 실행하면 내가 설치했던 의존 모듈들이 함께 설치된다.

 

하지만, 여기엔 문제가 몇가지 있다.

 

첫번째 문제는, 명시된 모듈이 다른 버전으로 설치될 수 있다는 것이다.

dependencies에 명시된 버전은 주로 범위로 표기된다. 예를들어 ^4.16.4라면 새 배포버전이 나온 경우 새 버전이 설치되어 내가 설치한 버전과 다른 사람이 설치했을때(또는 배포환경에서)의 모듈은 버전이 달라질 수 있다.

만약 이 버전의 차이가 파괴적인 변경이 있었다면, 심각한 에러가 발생할 수도 있다.

 

두번째 문제는, 명시된 모듈의 하위 종속 모듈이 다른 버전으로 설치될 수 있다.

몇 버전 이상이 아니라 정확히 어떤 버전을 설치하라고 명시하면 해결되지 않을까? 라고 생각했지만 그게 아니었다. 

일반적으로 하나의 패키지를 설치하면 하위의 다른 패키지들도 같이 설치된다.

+ express@4.16.2
added 12 packages in 5.24s

 

하위 패키지들에 대해서도 첫번째 문제와 같은 문제가 발생한다. 따라서 내 프로젝트의 package.json파일에 범위가 아니라 하나의 버전을 명시하더라도, 언제나 같은 버전의 모듈들이 설치되지 않을 수 있다.

 

이를 해결하기 위해 package-lock.json이 필요하다.

package-lock.json은 해당 패키지에 현재 설치되어 있는 모든 모듈들의 버전들이 트리 구조로 명시되어 있다.

따라서 package-lock.json의 버전을 관리한다면, 모든 환경에서 같은 버전의 모듈 구성을 사용할 수 있다.

 

사용중인 패키지들의 모든 하위 모듈을 파악할 수는 없으므로, 파괴적인 변화가 있는 새 버전이 출시되어도 안정성을 유지하기 위해 package-lock.json의 버전관리는 꼭 필요한 것 같다.

댓글