Python 패키지에 버전을 포함시키는 표준 방법?
Python 패키지와 버전 문자열을 연결할 수 있는 다음과 같은 표준 방법이 있는가?
import foo
print(foo.version)
추가 하드코딩 없이 데이터를 검색할 수 있는 방법이 있을 겁니다. 사소한/주요 문자열은setup.py
벌써내가 찾은 대안적 해결책은import __version__
나의foo/__init__.py
그리고 나서 가지고 있다.__version__.py
에 의해 생성된.setup.py
.
질문에 직접 대답하지 말고 이름을 짓는 것을 고려하십시오.__version__
아닌version
.
이것은 거의 준표준이다.표준 라이브러리의 많은 모듈 사용__version__
그리고 이것은 많은 제3자 모듈에서도 사용되므로 준표준이다.
보통은.__version__
끈이긴 하지만, 가끔은 떠 있거나 터플이 되기도 해.
편집: S에서 언급한 바와 같이.로트(고마워!), PEP 8은 분명히 다음과 같이 말한다.
모듈 레벨 던더 이름
모듈 수준 "분수"(즉, 선행 및 후행 밑줄이 2개인 이름)
__all__
__author__
__version__
, 등은 모듈 문서 문자열 뒤에 배치하되, 다음을 제외한 모든 가져오기 문 앞에 배치되어야 한다.__future__
수입품
또한 버전 번호가 PEP 440(이 표준의 이전 버전 PEP 386)에 설명된 형식을 준수하는지 확인해야 한다.
나는 싱글을 사용한다._version.py
버전 정보를 저장하는 "한 번 대포알 같은 장소"로 파일 작성:
그것은 a를 제공한다.
__version__
기여하다표준 메타데이터 버전을 제공한다.따라서 에 의해 감지될 것이다.
pkg_resources
또는 패키지 메타데이터를 구문 분석하는 기타 도구(EGG-INFO 및/또는 PKG-INFO, PEP 0345).패키지를 만들 때 패키지(또는 다른 것)를 가져오지 않아 경우에 따라 문제가 발생할 수 있다.(이 문제로 인해 발생할 수 있는 문제에 대해서는 아래 의견을 참조하십시오.)
버전 번호를 적는 곳은 한 곳뿐이어서 버전 번호가 바뀌면 변경할 수 있는 곳은 한 곳뿐이고, 버전이 일치하지 않을 가능성도 적다.
다음과 같은 방법으로, 버전 번호를 저장하는 "하나의 정식 장소"는 Python 패키지에 들어 있는 "_version.py"라는 이름의 .py 파일이며, 예를 들어,myniftyapp/_version.py
이 은 그것을 않는다! ( 되면 기능 이 파일은 Python 모듈인데, 당신의 setup.py은 그것을 가져오지 않는다! (그렇게 되면 기능 3을 상쇄할 것이다.대신 setup.py은 이 파일의 내용이 매우 간단하다는 것을 알고 있다.
__version__ = "3.6.5"
그래서 당신의 setup.py은 파일을 열고 다음과 같은 코드로 파싱한다.
import re
VERSIONFILE="myniftyapp/_version.py"
verstrline = open(VERSIONFILE, "rt").read()
VSRE = r"^__version__ = ['\"]([^'\"]*)['\"]"
mo = re.search(VSRE, verstrline, re.M)
if mo:
verstr = mo.group(1)
else:
raise RuntimeError("Unable to find version string in %s." % (VERSIONFILE,))
문자열을 "으로 "그다지 설정"으로 전달한다.py에서 이 문자열을 "버전" 인수의 값으로 전달하십시오.setup()
, 따라서 만족스러운 특징 2.
기능 1을 만족시키려면 (설정 시간이 아닌 런타임에) _버전 파일을 가져오도록 하십시오.myniftyapp/__init__.py
다음과 같은 경우:
from _version import __version__
여기 내가 몇 년 동안 사용해 온 이 기술의 예가 있다.
그 예시의 코드는 좀 더 복잡하지만, 내가 이 코멘트에 적은 단순화된 예시는 완전한 구현이 되어야 한다.
다음은 버전을 가져오는 예제 코드 입니다.
만약 이 접근방식에 잘못된 점이 있다면, 나에게 알려줘.
2017-05년 다시 작성
13년 이상 파이톤 코드를 쓰고 다양한 패키지를 관리한 끝에 DIY는 어쩌면 최선의 접근법이 아닐지도 모른다는 결론에 도달했다.
나는 그 제품을 사용하기 시작했다.pbr
내 패키지의 버전 관리를 위한 패키지.만약 당신이 당신의 SCM으로 git을 사용하고 있다면, 이것은 당신의 워크플로우에 마법처럼 들어맞을 것이고, 당신의 몇 주간의 일을 절약할 것이다(이 문제가 얼마나 복잡할 수 있는지에 대해 놀랄 것이다).
오늘날 pbr은 12M mongthly downloads를 가지고 있으며, 이 수준에 도달한 것은 어떤 더러운 속임수도 포함하지 않았다.그것은 단지 한 가지였습니다. 아주 간단한 방법으로 일반적인 포장 문제를 해결하십시오.
pbr
패키지 유지 관리 부담을 더 많이 수행할 수 있으며 버전 관리에만 국한되지 않지만, 패키지 유지 관리 부담을 모두 적용하도록 강요하지는 않는다.
pbr을 한 번에 채택하는 방법에 대한 아이디어를 제공하려면 pbr로 포장을 바꾸십시오.
아마도 해당 버전이 저장소에 전혀 저장되지 않는 것이 관찰되었을 것이다.PBR은 Git 지점과 태그에서 그것을 감지한다.
pbr은 애플리케이션을 패키지 또는 설치할 때 버전을 "컴파일"하고 캐시하므로 git 리포지토리가 없을 때 발생하는 작업에 대해 걱정할 필요가 없으므로 git에 대한 런타임 의존성이 없다.
기존 솔루션
지금까지 살펴본 가장 좋은 해결책이 여기에 있으며 그 이유는 다음과 같다.
내부yourpackage/version.py
:
# Store the version here so:
# 1) we don't load dependencies by storing it in __init__.py
# 2) we can import it in setup.py for the same reason
# 3) we can import it into your module module
__version__ = '0.12'
내부yourpackage/__init__.py
:
from .version import __version__
내부setup.py
:
exec(open('yourpackage/version.py').read())
setup(
...
version=__version__,
...
다른 접근법을 알고 있다면 나에게 알려줘.
지연된 PEP 396(모듈 버전 번호)에 따라 이를 위한 제안 방법이 있다.그것은 근거와 함께 모듈들이 따라야 할 (적용 가능한 선택사항) 표준을 설명한다.여기 작은 조각이 있다.
3) 모듈(또는 패키지)에 버전 번호가 포함되어 있는 경우, 해당 버전은 다음에서 제공되어야 한다.
__version__
기여하다- 네임스페이스 패키지 내부에 거주하는 모듈의 경우, 모듈에 다음이 포함되어야 한다.
__version__
기여하다네임스페이스 패키지 자체에는 자체 패키지가 포함되지 않아야 함__version__
기여하다)5) 더
__version__
속성의 값은 문자열이어야 한다.
비록 이것이 너무 늦었을지라도, 이전 대답에 대한 조금 더 간단한 대안이 있다.
__version_info__ = ('1', '2', '3')
__version__ = '.'.join(__version_info__)
(그리고, 버전 번호의 자동 증가 부분을 문자열로 변환하는 것은 매우 간단할 것이다.str()
.)
물론 내가 본 바로는 사람들은 사용할 때 앞에서 말한 것과 같은 것을 사용하는 경향이 있다.__version_info__
, 그리고 그렇게 저장하기 때문에 그것을 ints의 tuple로 한다. 그러나 나는 그렇게 하는 것의 요점을 잘 모르겠다. 나는 당신이 호기심이나 자동증가 외에 어떤 목적으로든 버전 번호의 부분에 덧셈과 뺄셈과 같은 수학적 연산을 수행할 수 있는 상황들이 있는지 의심하기 때문이다.int()
, 그리고str()
상당히 쉽게 사용할 수 있다.(반면 다른 사람의 코드가 문자열 튜플보다 숫자 튜플을 기대하여 실패할 가능성이 있다.)
이것은 물론 나 자신의 견해고, 나는 다른 사람들이 숫자 튜플을 사용하는 것에 대해 기꺼이 의견을 주었으면 한다.
셰지가 나에게 상기시켰듯이, 숫자 문자열의 비교는 반드시 직접 수치 비교와 같은 결과를 가지는 것은 아니다. 그것을 위해 선행 0이 필요할 것이다.그래서 결국, 저장하기.__version_info__
정수 값의 튜플로서 (혹은 뭐라고 부르든) 보다 효율적인 버전 비교가 가능할 것이다.
이러한 솔루션 중 많은 부분이 무시됨git
여러 위치에서 버전을 추적해야 하는 버전 태그(불량).나는 다음과 같은 목표를 가지고 이것에 접근했다.
- 는 의 python의 한다.
git
리포 - 자동화
git tag
/push
, 그리고setup.py upload
입력하지 않는 단일 명령의 스텝
작동 방식:
a로부터
make release
명령어, git repo에서 마지막으로 태그가 지정된 버전이 발견되어 증가함.태그가 뒤로 밀리다.origin
.그
Makefile
버전을 에 저장하다src/_version.py
될 이다.setup.py
또한 릴리스에 포함됨.소스 컨트롤을 체크인하지 마십시오!setup.py
명령에서 새 버전 문자열을 읽음package.__version__
.
세부사항:
메이크파일
# remove optional 'v' and trailing hash "v1.0-N-HASH" -> "v1.0-N"
git_describe_ver = $(shell git describe --tags | sed -E -e 's/^v//' -e 's/(.*)-.*/\1/')
git_tag_ver = $(shell git describe --abbrev=0)
next_patch_ver = $(shell python versionbump.py --patch $(call git_tag_ver))
next_minor_ver = $(shell python versionbump.py --minor $(call git_tag_ver))
next_major_ver = $(shell python versionbump.py --major $(call git_tag_ver))
.PHONY: ${MODULE}/_version.py
${MODULE}/_version.py:
echo '__version__ = "$(call git_describe_ver)"' > $@
.PHONY: release
release: test lint mypy
git tag -a $(call next_patch_ver)
$(MAKE) ${MODULE}/_version.py
python setup.py check sdist upload # (legacy "upload" method)
# twine upload dist/* (preferred method)
git push origin master --tags
그release
타겟은 항상 세 번째 버전 숫자를 증가시키지만 당신은next_minor_ver
또는next_major_ver
다른 자릿수를 늘리기 위해.명령은 에 의존한다.versionbump.py
의 .
버전 덤프파이를 치다
"""An auto-increment tool for version strings."""
import sys
import unittest
import click
from click.testing import CliRunner # type: ignore
__version__ = '0.1'
MIN_DIGITS = 2
MAX_DIGITS = 3
@click.command()
@click.argument('version')
@click.option('--major', 'bump_idx', flag_value=0, help='Increment major number.')
@click.option('--minor', 'bump_idx', flag_value=1, help='Increment minor number.')
@click.option('--patch', 'bump_idx', flag_value=2, default=True, help='Increment patch number.')
def cli(version: str, bump_idx: int) -> None:
"""Bumps a MAJOR.MINOR.PATCH version string at the specified index location or 'patch' digit. An
optional 'v' prefix is allowed and will be included in the output if found."""
prefix = version[0] if version[0].isalpha() else ''
digits = version.lower().lstrip('v').split('.')
if len(digits) > MAX_DIGITS:
click.secho('ERROR: Too many digits', fg='red', err=True)
sys.exit(1)
digits = (digits + ['0'] * MAX_DIGITS)[:MAX_DIGITS] # Extend total digits to max.
digits[bump_idx] = str(int(digits[bump_idx]) + 1) # Increment the desired digit.
# Zero rightmost digits after bump position.
for i in range(bump_idx + 1, MAX_DIGITS):
digits[i] = '0'
digits = digits[:max(MIN_DIGITS, bump_idx + 1)] # Trim rightmost digits.
click.echo(prefix + '.'.join(digits), nl=False)
if __name__ == '__main__':
cli() # pylint: disable=no-value-for-parameter
이 된다.git
.
__init___py
그my_module/_version.py
파일이 로 가져오기됨my_module/__init__.py
을 여기에 모듈과 함께 배포할 정적 설치 구성을 여기에 입력하십시오.
from ._version import __version__
__author__ = ''
__email__ = ''
setup.py
마지막 단계는 에서 버전 정보를 읽는 것이다.my_module
모듈
from setuptools import setup, find_packages
pkg_vars = {}
with open("{MODULE}/_version.py") as fp:
exec(fp.read(), pkg_vars)
setup(
version=pkg_vars['__version__'],
...
...
)
물론, 이 모든 것이 작동하려면 리포에서 버전 태그를 하나 이상 사용해야 한다.
git tag -a v0.0.1
나는 패키지 dir에 있는 JSON 파일을 사용한다.이것은 주코의 요구 조건에 들어맞는다.
내부pkg_dir/pkg_info.json
:
{"version": "0.1.0"}
내부setup.py
:
from distutils.core import setup
import json
with open('pkg_dir/pkg_info.json') as fp:
_info = json.load(fp)
setup(
version=_info['version'],
...
)
내부pkg_dir/__init__.py
:
import json
from os.path import dirname
with open(dirname(__file__) + '/pkg_info.json') as fp:
_info = json.load(fp)
__version__ = _info['version']
.pkg_info.json
, 작가처럼.나는 메타데이터 관리를 자동화할 수 있기 때문에 JSON을 사용하는 것을 좋아한다.
이 질문이 처음 제기되었을 때부터 획일적인 버전 지정과 규약 지원을 위한 많은 작업이 완료되었다.이제 Python Packaging User Guide에 입맛에 맞는 옵션이 자세히 설명되어 있다.또한 PEP 440당 파이썬에서는 버전 번호 체계가 비교적 엄격하기 때문에, 당신의 패키지가 치즈샵에 출시될 경우, 상황을 제대로 유지하는 것이 중요하다.
다음은 버전 관리 옵션에 대한 간략한 설명:
- 파일 읽기 위치
setup.py
(setuptools)하고 버전을 가져오십시오. - 외부 빌드 도구 사용(두 가지 모두 업데이트)
__init__.py
소스 제어(예: 범프2버전, 변경 또는 zest.leaser). - 값을 a로 설정
__version__
특정 모듈의 전역 변수. - setup.py과 코드가 모두 읽을 수 있도록 간단한 VISION 텍스트 파일에 값을 넣으십시오.
- a를 통해 값 설정
setup.py
release 및 importlib.metadata를 사용하여 런타임에 픽업하십시오. (경고, 3.8 이전 버전과 3.8 이후 버전이 있음). - 값을 다음으로 설정
__version__
에sample/__init__.py
샘플 가져오기setup.py
. - setuptools_scm를 사용하여 소스 제어에서 버전 관리를 추출하여 코드가 아닌 표준 참조가 되도록 하십시오.
(7)이 가장 현대적인 접근방식일 수 있다는 점에 유의하십시오(빌드 메타데이터는 코드와 독립적이며 자동화에 의해 출판됨).또한 패키지 릴리스에 설정을 사용하는 경우 다음과 같은 간단한 사항도 참조하십시오.python3 setup.py --version
버전을 직접 보고할 것이다.
또한 주목할 만한 것은 그뿐만 아니라__version__
반신반의하는 것.파이톤에서는 그렇다.__version_info__
간단한 경우 다음과 같은 작업을 수행할 수 있는 튜플:
__version__ = '1.2.3'
__version_info__ = tuple([ int(num) for num in __version__.split('.')])
은 ...을 수 .그리고 당신은 그 것을 얻을 수 있다.__version__
파일이나 뭐 그런 것들로부터 끈을 빼내거나.
파이톤 패키지에 버전 문자열을 삽입하는 표준 방법은 없는 것 같다.내가 본 대부분의 패키지는 당신의 솔루션의 변종(즉, Eitner)을 사용한다.
포 embed
setup.py
가지고 있다setup.py
모듈을 생성하다(예:version.py
)은(는) 버전 정보만 포함하며, 패키지에서 가져온 정보 또는그 반대: 버전 정보를 패키지 자체에 넣고, 버전을 설정하려면
setup.py
나는 또 다른 스타일을 보았다.
>>> django.VERSION
(1, 1, 0, 'final', 0)
화살은 그것을 흥미롭게 다룬다.
지금 (2e5031b 이후)
인arrow/__init__.py
:
__version__ = 'x.y.z'
인setup.py
:
from arrow import __version__
setup(
name='arrow',
version=__version__,
# [...]
)
이전
인arrow/__init__.py
:
__version__ = 'x.y.z'
VERSION = __version__
인setup.py
:
def grep(attrname):
pattern = r"{0}\W*=\W*'([^']+)'".format(attrname)
strval, = re.findall(pattern, file_text)
return strval
file_text = read(fpath('arrow/__init__.py'))
setup(
name='arrow',
version=grep('__version__'),
# [...]
)
사용.setuptools
, 그리고pbr
버전을 관리하는 표준 방법은 없지만 패키지를 관리하는 표준 방법은setuptools
.
버전 관리를 위해 전체적으로 찾은 최고의 솔루션은setuptools
…과 함께pbr
이것은 이제 나의 표준 버전 관리 방법이다.
전체 포장을 위해 프로젝트를 설정하는 것은 간단한 프로젝트에서는 지나친 것일 수 있지만, 버전을 관리해야 한다면, 당신은 아마도 모든 것을 설정하기에 적절한 수준에 있을 것이다.이렇게 하면 PyPi에서 패키지를 양도할 수 있으므로 모든 사람이 Pip과 함께 다운로드하여 사용할 수 있다.
PBR은 대부분의 메타데이터를setup.py
와 도(道)로.setup.cfg
그런 다음 버전을 포함할 수 있는 대부분의 메타데이터의 소스로 사용되는 파일.이렇게 하면 메타데이터를 다음과 같은 것을 사용하여 실행 가능한 파일로 패키징할 수 있다.pyinstaller
필요한 경우(있는 경우, 이 정보가 필요할 수 있음), 메타데이터를 다른 패키지 관리/프로그래밍 스크립트와 분리하십시오.버전 문자열을 직접 업데이트할 수 있는 위치setup.cfg
그러면 안 .*.egg-info
패키지 릴리즈를 작성할 때 폴더.그러면 스크립트는 다양한 방법을 사용하여 메타데이터에서 버전에 액세스할 수 있다(이러한 프로세스는 아래 섹션에 설명되어 있음).
VCS/SCM에 Git을 사용할 경우, 버전, 작성자, 변경 로그 등을 포함한 일부 메타데이터에 대해 사용자의 repo가 주요 진실의 소스가 될 수 있도록 Git에서 많은 메타데이터를 끌어들이기 때문에 이 설정은 더욱 좋다.버전에 대해서는 repo에 git 태그를 기준으로 현재 커밋에 대한 버전 문자열을 생성한다.
- PyPA - SetupTools로 Python 패키지 포장 - 자습서
- PBR 최신 빌드 사용 설명서 - 8라인 설정 방법
setup.py
그리고 asetup.cfg
메타데이터를 파일로 저장하다
, PBR의 일부 는 PBRit repoepo에 있다.setup.cfg
패키지에 대한 배포가 생성될 때마다 제외 및 자동 생성 가능(사용)setup.py
)
실시간으로 현재 버전 가져오기
setuptools
을 사용하여 실시간에 최신 정보를 가져올 수 있음setup.py
:
python setup.py --version
하면 이다.setup.cfg
파일 또는 git repo에서 만든 최신 커밋과 repo에 존재하는 태그를 기준으로 한다.그러나 이 명령은 배포의 버전을 업데이트하지 않는다.
버전 메타데이터 업데이트
다음 명령을 사용하여 분포를 생성하는 경우setup.py
(즉,py setup.py sdist
, 예를 들어), 그러면 모든 현재 정보가 추출되어 배포에 저장될 것이다.이것은 본질적으로setup.py --version
버전 한다.package.egg-info
배포 메타데이터를 저장하는 파일 집합의 폴더.
버전 메타 데이터 업데이트 프로세스에 대한 참고 사항:
pbr을 사용하여 git에서 버전 데이터를 가져오지 않는 경우 setup.cfg를 새 버전 정보로 직접 업데이트하십시오(간편하지만 이것이 릴리스 프로세스의 표준 부분인지 확인하십시오).
git를 사용 중이고 소스 또는 이진 분포를 생성할 필요가 없는 경우(사용
python setup.py sdist
또는 그 중 하나python setup.py bdist_xxx
명령) git repo 정보를 사용자로 업데이트하는 가장 간단한 방법<mypackage>.egg-info
메타데이터 폴더는 단지python setup.py install
명령하다이렇게 하면 git repo에서 메타데이터를 꺼내는 것과 관련된 모든 PBR 기능이 실행되고 로컬이 업데이트됨.egg-info
폴더, 정의한 모든 진입점에 대한 스크립트 실행 파일 및 이 명령을 실행할 때 출력에서 볼 수 있는 기타 기능 설치.:
.egg-info
된다..gitignore
파일(예: Gitignore).IO), 소스에서 생성될 수 있으므로제외된 경우, 릴리스 전에 메타데이터를 로컬로 업데이트하기 위한 표준 "릴리스 프로세스"가 있는지 확인하십시오. PyPi.org에 업로드하거나 배포하는 모든 패키지는 올바른 버전을 가지려면 이 데이터를 포함해야 한다.Git repo에 이 정보를 포함하도록 하려면 특정 파일을 무시하지 않도록 제외하십시오(예: 추가).!*.egg-info/PKG_INFO
로.gitignore
)
스크립트에서 버전 액세스
패키지의 Python 스크립트 내의 현재 빌드에서 메타데이터에 액세스할 수 있다.예를 들어 버전에 대해서는 지금까지 찾아낸 몇 가지 방법이 있다.
## This one is a new built-in as of Python 3.8.0 should become the standard
from importlib.metadata import version
v0 = version("mypackage")
print('v0 {}'.format(v0))
## I don't like this one because the version method is hidden
import pkg_resources # part of setuptools
v1 = pkg_resources.require("mypackage")[0].version
print('v1 {}'.format(v1))
# Probably best for pre v3.8.0 - the output without .version is just a longer string with
# both the package name, a space, and the version string
import pkg_resources # part of setuptools
v2 = pkg_resources.get_distribution('mypackage').version
print('v2 {}'.format(v2))
## This one seems to be slower, and with pyinstaller makes the exe a lot bigger
from pbr.version import VersionInfo
v3 = VersionInfo('mypackage').release_string()
print('v3 {}'.format(v3))
이것들 중 하나를 직접 당신의 안에 넣을 수 있다.__init__.py
패키지가 다음과 같이 버전 정보를 추출하는 경우(다른 답변과 유사함)
__all__ = (
'__version__',
'my_package_name'
)
import pkg_resources # part of setuptools
__version__ = pkg_resources.get_distribution("mypackage").version
가장 간단하고 신뢰할 수 있는 솔루션을 찾기 위해 몇 시간 동안 노력한 후 다음 사항을 살펴보십시오.
패키지 "/mypackage" 폴더 내부에 version.py 파일을 만드십시오.
# Store the version here so:
# 1) we don't load dependencies by storing it in __init__.py
# 2) we can import it in setup.py for the same reason
# 3) we can import it into your module module
__version__ = '1.2.7'
설치하여py:
exec(open('mypackage/version.py').read())
setup(
name='mypackage',
version=__version__,
기본 폴더 초기화 중.py:
from .version import __version__
그exec()
setup.py은 모듈을 가져오기 전에 실행되기 때문에 함수는 가져오기 전에 스크립트를 실행한다.여전히 한 곳에서 한 파일에 있는 버전 번호만 관리하면 되는데 아쉽게도 setup.py에는 없다.(그것이 단점이지만 수입 버그가 없는 것이 상승)
범프투버젼의 pbr.
이 해결책은 이 글에서 도출되었다.
사용 사례 - PyInstaller를 통해 배포된 python GUI 패키지.버전 정보를 표시해야 함.
여기 프로젝트의 구조가 있다.packagex
packagex
├── packagex
│ ├── __init__.py
│ ├── main.py
│ └── _version.py
├── packagex.spec
├── LICENSE
├── README.md
├── .bumpversion.cfg
├── requirements.txt
├── setup.cfg
└── setup.py
어디에setup.py
이다
# setup.py
import os
import setuptools
about = {}
with open("packagex/_version.py") as f:
exec(f.read(), about)
os.environ["PBR_VERSION"] = about["__version__"]
setuptools.setup(
setup_requires=["pbr"],
pbr=True,
version=about["__version__"],
)
packagex/_version.py
포함하다
__version__ = "0.0.1"
, 그리고packagex/__init__.py
from ._version import __version__
그리고 위하여.bumpversion.cfg
[bumpversion]
current_version = 0.0.1
commit = False
tag = False
parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)(\-(?P<release>[a-z]+)(?P<build>\d+))?
serialize =
{major}.{minor}.{patch}-{release}{build}
{major}.{minor}.{patch}
[bumpversion:part:release]
optional_value = prod
first_value = dev
values =
dev
prod
[bumpversion:file:packagex/_version.py]
- 다음 이름으로 파일 만들기
_version.txt
와 같은 폴더로__init__.py
한 줄로 버전을 작성하십시오.
0.8.2
- 파일에서 이 정보 읽기
_version.txt
에__init__.py
:
import os
def get_version():
with open(os.path.join(os.path.abspath(os.path.dirname(__file__)), "_version.txt")) as f:
return f.read().strip()
__version__ = get_version()
나는 설치 환경에서 패키지 버전을 읽는 것을 선호한다.이것은 나의 것이다.src/foo/_version.py
:
from pkg_resources import get_distribution
__version__ = get_distribution('osbc').version
보증하다, 확인하다, 확신하다foo
항상 이미 설치되어 있으므로src/
막으려면 층이 필요하다.foo
설치하지 않고 가져온
에서setup.py
, setuptools-scm을 사용하여 버전을 자동으로 생성한다.
나는 여기에 의지하여 표준적이고 현대적인 방법을 묘사했다.setuptools_scm
나는 할 수 이런 패턴은 지난 몇 년 동안 수십 개의 출판된 패키지에 대해 성공적으로 작동했기 때문에, 나는 그것을 따뜻하게 추천할 수 있다.
다음이 필요하지 않다는 점에 유의하십시오.getversion
이 패턴을 구현하기 위한 패키지.마침 그 일이 일어났다.getversion
설명서가 이 팁을 호스트한다.
- 사용 a
version.py
에게만 제출하다.__version__ = <VERSION>
파일의 매개 변수에서setup.py
파일 가져오기__version__
파라메터, 그리고 그것의 가치를 에 넣는다.setup.py
다음과 같이 파일:version=__version__
- 또 다른 방법은 단지 a를 사용하는 것이다.
setup.py
을 제출하다.version=<CURRENT_VERSION>
로 되어 CURRENT_VERSION 이 하다.
새 태그(새 패키지 버전 릴리스 준비)를 생성할 때마다 파일의 버전을 수동으로 변경하지 않기 때문에 다음을 사용할 수 있다.
범프버전 패키지를 적극 추천한다.나는 몇 년 동안 버젼을 맞추기 위해 그것을 사용해 왔다.
덧셈으로 시작하다version=<VERSION>
당신께setup.py
아직 가지고 있지 않은 경우 파일링하십시오.
버전을 실행할 때마다 다음과 같은 짧은 스크립트를 사용하십시오.
bumpversion (patch|minor|major) - choose only one option
git push
git push --tags
그런 다음 호출된 리포당 하나의 파일을 추가하십시오..bumpversion.cfg
:
[bumpversion]
current_version = <CURRENT_TAG>
commit = True
tag = True
tag_name = {new_version}
[bumpversion:file:<RELATIVE_PATH_TO_SETUP_FILE>]
참고:
- 사용할 수 있다
__version__
의 매개 변수.version.py
다른 게시물에서 제안된 것처럼 파일을 작성하고 범프버전 파일을 다음과 같이 업데이트하십시오.[bumpversion:file:<RELATIVE_PATH_TO_VERSION_FILE>]
- 해야 한다
git commit
또는git reset
네 레포 안의 모든 것을, 그렇지 않으면 더러운 레포 오류가 생길 것이다. - 가상 환경에 범프버전 패키지가 포함되어 있는지 확인하십시오. 범프버전 패키지는 작동하지 않습니다.
있는 NumPy distutils를 ,numpy.distutils.misc_util.Configuration
내부에 수정 번호를 삽입하는 방법이 있음package.__svn_version__
변수에 있어서version
.
CVS(또는 RCS)를 사용하고 빠른 솔루션을 원하는 경우 다음을 사용하십시오.
__version__ = "$Revision: 1.1 $"[11:-2]
__version_info__ = tuple([int(s) for s in __version__.split(".")])
(물론, 개정 번호는 CVS로 대체될 것이다.)
인쇄 친화적인 버전과 가져오려는 모듈에 최소한 예상 버전이 있는지 확인하는 데 사용할 수 있는 버전 정보가 제공됨:
import my_module
assert my_module.__version_info__ >= (1, 1)
참조URL: https://stackoverflow.com/questions/458550/standard-way-to-embed-version-into-python-package
'programing' 카테고리의 다른 글
rxjs 단위로 구독당 한 번 관측 가능한 파이프에서 초기화 로직을 수행하는 방법 (0) | 2022.03.25 |
---|---|
라라벨과 함께 뷔에티파 (0) | 2022.03.25 |
PDF를 텍스트로 변환하기 위한 Python 모듈 (0) | 2022.03.25 |
반응 useState는 여기서 기본값을 허용하지 않는 것 같으십니까? (0) | 2022.03.25 |
"이러한 로더의 결과를 처리하기 위해서는 추가 로더가 필요할 수도 있다." (0) | 2022.03.25 |