라이브러리 버전 규칙에 대한 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내에 버전을 수정해서 업데이트 하는 방식은 매우 번거롭습니다.
'프로그래밍 > 기타 프로그래밍' 카테고리의 다른 글
[XCode] info.list를 수정하여 iOS 앱 이름 바꾸기 (0) | 2023.03.19 |
---|---|
[XCode] Build Setting 빌드 환경 변수 목록 확인하기 (0) | 2023.03.19 |
[npm] package.json 과 package-lock.json 차이점 이해와 필요성 (0) | 2023.03.06 |
[Python3] dictionary 사용 방법 (0) | 2023.02.13 |
[Python3] 다차원 리스트 생성 (0) | 2023.02.12 |