본문 바로가기
Python

[Etc] SW Version: Semantic Versioning + package.version

by ds31x 2024. 9. 19.

Semantic Versioning System

Semantic Versioning (SemVer) 시스템에 따라,

소프트웨어에서 major와 minor, patch (or micro) 버전을 구분하여 버전을 매김.

이는 버전 번호를 MAJOR.MINOR.PATCH 형식으로 표현.

  1. MAJOR 버전:
    • 이전 버전과 호환되지 않는 API 변경이 있을 때 증가.
    • 큰 기능 변경이나 구조적 변화가 있을 때 증가.
  2. MINOR 버전:
    • 이전 버전과 호환되는 새로운 기능을 추가할 때 증가.
    • 기존 기능의 개선이나 작은 변경사항이 있을 때 증가.

3. PATCH 버전 (or Micro 버전):

  • 버그 수정이나 성능 개선과 같은 작은 변경사항이 있을 때 증가.

예를 들어, 버전 2.1.3에서:

  • 2는 MAJOR 버전
  • 1은 MINOR 버전
  • 3은 PATCH 버전

Python의 package.version

Python의 경우 version 의 문자열을 parse하여

  • 대소비교,
  • 정렬,
  • 유효성 검사,
  • 또는 각 속성을 쉽게 접근케 해주는
  • package.version 모듈을 제공.

packaging.version 모듈의 Version 객체에 대해 주요 Attributes:

  1. major: 메이저 버전 번호 (int)
  2. minor: 마이너 버전 번호 (int)
  3. micro: 마이크로(패치) 버전 번호 (int)
  4. pre: 프리릴리즈 정보 (tuple 또는 None)
    • 정식 릴리스 전의 버전.
    • 주로 alpha, beta, rc(release candidate) 등이 포함됨.
    • 아직 완전히 테스트되지 않았거나 불안정할 수 있는 버전.
    • 예: 1.0.0a1, 2.3.0b2, 3.1.0rc1
  5. post: 포스트릴리스 번호 (tuple 또는 None)
    • 정식 릴리스 이후의 minor 수정을 나타냄.
    • 주로 버그 수정이나 문서 업데이트 등 작은 변경사항에 사용.
    • 기능적으로는 원래 버전과 동일.
    • 예: 1.0.0.post1, 2.3.0.post2
  6. dev: 개발 릴리스 번호 (int 또는 None)
    • 개발 중인 버전을 나타냄.
    • 주로 다음 버전을 위해 개발 진행 중인 작업을 표시.
    • 매우 불안정하고 자주 변경될 수 있습니다.
    • 예: 1.1.0.dev1, 2.0.0.dev20
  7. local: 로컬 버전 식별자 (str 또는 None)
  8. public: 공개 버전 식별자 (str)
  9. base_version: 기본 버전 (메이저.마이너.마이크로)
  10. epoch: 버전의 에포크 (int)

예제0:

from packaging import version

v = version.parse("1.2.3rc1+build.4")

print(f"Major: {v.major}")
print(f"Minor: {v.minor}")
print(f"Micro: {v.micro}")
print(f"Pre-release: {v.pre}")
print(f"Post-release: {v.post}")
print(f"Dev release: {v.dev}")
print(f"Local: {v.local}")
print(f"Public: {v.public}")
print(f"Base version: {v.base_version}")
print(f"Epoch: {v.epoch}")

 

이 코드의 출력은 다음과 같음:

Major: 1
Minor: 2
Micro: 3
Pre-release: ('rc', 1)
Post-release: None
Dev release: None
Local: build.4
Public: 1.2.3rc1
Base version: 1.2.3
Epoch: 0

버전이 최신일수록 크다고 판정한다.

다음을 참고:

1.0.0.dev1 < 1.0.0a1 < 1.0.0b1 < 1.0.0rc1 < 1.0.0 < 1.0.0.post1

예제1

from packaging import version

v1 = version.parse("1.2.3")
v2 = version.parse("2.0.0")

# 비교 연산자 사용
print(v1 < v2)  # True
print(v1 == v2)  # False
print(v1 > v2)  # False

# 버전 간 대소 비교
print(version.parse("1.2.3") < version.parse("1.3.0"))  # True

# 버전 정렬
versions = ["1.0.0", "2.0.0", "1.2.3", "1.2.0", "1.0.1"]
sorted_versions = sorted(versions, key=version.parse)
print(sorted_versions)
# ['1.0.0', '1.0.1', '1.2.0', '1.2.3', '2.0.0']

# 버전 유효성 검사
try:
    version.parse("invalid.version")
except version.InvalidVersion:
    print("Invalid version string")

참고

  • rc : release candidate 의 약자. alpha, beta 이후의 단계로 release 직전인 상태. 큰 에러가 없다면 release가 됨.
  • local version identifier: "1.2.3rc1+build.4"에서 "+" 기호
    • 의미:
      • 공식 릴리스 버전에 영향을 주지 않는 추가 정보를 제공.
      • 빌드 정보, 날짜 스탬프, 또는 기타 메타데이터를 포함할 수 있음.
      • PEP 440 (Python 버전 규격)에 정의되어 있습니다.
    • 구조:
      • + 기호 이후의 모든 것이 로컬 버전 식별자.
      • 이 예에서는 build.4가 로컬 버전 식별자임.
    • 특징:
      • 로컬 버전은 버전 비교에 영향을 주지 않음.
      • 동일한 공식 버전의 다른 빌드나 변형을 구분하는 데 사용됨.
728x90

'Python' 카테고리의 다른 글

[CV] cv2.calibrateCamera  (1) 2024.09.22
[Summary] NumPy(Numerical Python)  (1) 2024.09.12
[Py] Namespace Package  (0) 2024.09.11
[CV] Chessboard관련 함수들: OpenCV  (0) 2024.09.10
[NumPy] ravel() 메서드 with flatten() 메서드  (0) 2024.09.09