컴퓨터공학/기타 프로그래밍

[npm] 라이브러리 버전 semantic versioning 가이드라인 이해하기

TaeGyeong Lee 2023. 3. 7. 00:30

라이브러리 버전 규칙에 대한 npm 가이드라인을 서술합니다.

 

npm의 semantic versioning

npm 공식 문서에서는 라이브러리 버전 설정 시 아래와 같이 버전을 설정하도록 권장하고 있습니다.

메이저.마이너.패치 형태로 버전을 명시

  • 최초 배포 버전 : 1.0.0
  • 호환되는 버그 패치 버전 : 1.0.1
  • 호환되는 새 기능 추가 버전 : 1.1.0
  • 호환되지 않는 새 기능 추가 버전 : 2.0.0

즉, 이전 버전과 호환 여부에 따라 메이저, 이전 버전과 호환되는 새로운 기능인 경우 마이너, 기타 버그 패치와 같은 자잘한 작업의 경우 패치 버전을 결정합니다.

 

틸드(~)와 캐롯(^)

위에서 라이브러리 버전이 어떻게 구성되는지 이해했습니다. 허나 package.json에는 버전뿐만 아니라 버전 옆 틸드(~) 또는 캐롯(^)이 명시되어 있습니다. 

  • ^3.3.1 : 3.3.1부터 4.x 전까지의 버전을 포함합니다. 3.3.0와 3.2.6은 포함되지 않습니다.
  • ~3.3.1 : 3.3.1 부터 3.4.x 전까지의 버전을 포함합니다. 3.3.0와 3.2.6은 포함되지 않습니다.

틸드(~)는 마이너, 패치 버전을 포함하고 캐롯(^)은 패치 버전만 포함합니다. 보다 자세히 알고 싶다면 npm semver caculator를 참고하세요.

 

한계

라이브러리를 개발하는 개발자가 이를 지키지 않으면 아무 소용도 없습니다.

이를 정확히 인지하지 않은 채 라이브러리를 배포하는 사람들이 대부분일 거라 생각합니다. (저도 그랬습니다..) 가이드라인을 지키지 않는 실태가 의존성 문제를 야기하는 요소 중에 하나가 되지 않을까 하네요.

모두 이를 지키는 착한 개발자가 되도록 합시다..!

 

추가 질문

package.json에서 정확한 버전을 명시하지 않은 이유

참고) 일부 라이브러리는 package.json 버전을 package-lock.json 과 동일한 방식으로 명시했을 수도 있습니다. 하지만 이는 올바르지 않은 방법이며 대중적이고 가이드라인에 충실한 라이브러리는 설명한 바와 같이 각자 다른 방식으로 명시합니다.

express를 예로 들어 보겠습니다. (23년 3월 기준) express를 설치한 후 package.json을 살펴보면..

package.json에선 ^4.18.2 즉 4.18.2, 4.18.3, 4.18.4... 현재 버전을 포함한 모든 패치 버전을 명시하고 있습니다.

이는 패치 버전 업데이트에 대한 피로를 덜어주기 위함입니다. 패치 버전 변경 수준의 업데이트는 사소하며 자주 발생합니다.

새로운 패치 버전이 나올 때마다 package.json내에 버전을 수정해서 업데이트 하는 방식은 매우 번거롭습니다.