programing

Python 패키지에 버전을 포함시키는 표준 방법?

prostudy 2022. 3. 25. 22:07
반응형

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버전 정보를 저장하는 "한 번 대포알 같은 장소"로 파일 작성:

  1. 그것은 a를 제공한다.__version__기여하다

  2. 표준 메타데이터 버전을 제공한다.따라서 에 의해 감지될 것이다.pkg_resources또는 패키지 메타데이터를 구문 분석하는 기타 도구(EGG-INFO 및/또는 PKG-INFO, PEP 0345).

  3. 패키지를 만들 때 패키지(또는 다른 것)를 가져오지 않아 경우에 따라 문제가 발생할 수 있다.(이 문제로 인해 발생할 수 있는 문제에 대해서는 아래 의견을 참조하십시오.)

  4. 버전 번호를 적는 곳은 한 곳뿐이어서 버전 번호가 바뀌면 변경할 수 있는 곳은 한 곳뿐이고, 버전이 일치하지 않을 가능성도 적다.

다음과 같은 방법으로, 버전 번호를 저장하는 "하나의 정식 장소"는 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입력하지 않는 단일 명령의 스텝

작동 방식:

  1. a로부터make release명령어, git repo에서 마지막으로 태그가 지정된 버전이 발견되어 증가함.태그가 뒤로 밀리다.origin.

  2. Makefile버전을 에 저장하다src/_version.py 될 이다.setup.py또한 릴리스에 포함됨.소스 컨트롤을 체크인하지 마십시오!

  3. 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당 파이썬에서는 버전 번호 체계가 비교적 엄격하기 때문에, 당신의 패키지가 치즈샵에 출시될 경우, 상황을 제대로 유지하는 것이 중요하다.

다음은 버전 관리 옵션에 대한 간략한 설명:

  1. 파일 읽기 위치setup.py(setuptools)하고 버전을 가져오십시오.
  2. 외부 빌드 도구 사용(두 가지 모두 업데이트)__init__.py소스 제어(예: 범프2버전, 변경 또는 zest.leaser).
  3. 값을 a로 설정__version__특정 모듈의 전역 변수.
  4. setup.py과 코드가 모두 읽을 수 있도록 간단한 VISION 텍스트 파일에 값을 넣으십시오.
  5. a를 통해 값 설정setup.pyrelease 및 importlib.metadata를 사용하여 런타임에 픽업하십시오. (경고, 3.8 이전 버전과 3.8 이후 버전이 있음).
  6. 값을 다음으로 설정__version__sample/__init__.py샘플 가져오기setup.py.
  7. 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)을 사용한다.

  1. 포 embedsetup.py가지고 있다setup.py모듈을 생성하다(예:version.py)은(는) 버전 정보만 포함하며, 패키지에서 가져온 정보 또는

  2. 그 반대: 버전 정보를 패키지 자체에 넣고, 버전을 설정하려면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 태그를 기준으로 현재 커밋에 대한 버전 문자열을 생성한다.

, 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]
  1. 다음 이름으로 파일 만들기_version.txt와 같은 폴더로__init__.py한 줄로 버전을 작성하십시오.
0.8.2
  1. 파일에서 이 정보 읽기_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설명서가 이 팁을 호스트한다.

  1. 사용 aversion.py에게만 제출하다.__version__ = <VERSION>파일의 매개 변수에서setup.py파일 가져오기__version__파라메터, 그리고 그것의 가치를 에 넣는다.setup.py다음과 같이 파일:version=__version__
  2. 또 다른 방법은 단지 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

반응형