setup.py(setuptools)和源代码中的自动版本号?

Ser*_*yev 37 python git distutils version setuptools

情况:

我有一个python库,由git控制,并与distutils/setuptools捆绑在一起.我想基于git标签自动生成版本号,包括for setup.py sdist和alike命令,以及库本身.

对于我可以使用的第一个任务git describe或类似的解决方案(请参阅 如何在我的包中的setup.py(setuptools)中定义版本?).

例如,当我在标签'0.1'并且要求'setup.py sdist'时,我得到'mylib-0.1.tar.gz'; 或'mylib-0.1-3-abcd.tar.gz'如果我在标记后更改了代码.这可以.

问题是:

当我想让这个版本号可用于库本身时,问题出现了,所以它可以将它作为'mylib/0.1-3-adcd'发送到User-Agent HTTP头中.

如果我添加setup.py version命令,如何在我的包中获得setup.py(setuptools)中定义的版本?,然后在制作标签后生成此version.py,因为它使用标记作为值.但是在这种情况下,我需要在制作版本标记之后再进行一次提交,以使代码保持一致.反过来,这需要一个新标签进行进一步捆绑.

问题是:

如何打破这个依赖圈(generate-commit-tag-generate-commit-tag -...)?

Éri*_*ujo 30

您还可以反转依赖项:将版本放入mylib/__init__.py,在setup.py中解析该文件以获取版本参数,并在命令行上使用git tag $(setup.py --version)来创建标记.

git tag -a v$(python setup.py --version) -m 'description of version'
Run Code Online (Sandbox Code Playgroud)

你还有什么比这更复杂的事我还没理解?

  • 我碰到这个问题是'__init __.py`进口你的模块,这反过来又导入其中的setup.py将安装_after_处理`__init __.py`为您的版本号的外部依赖.Ergo:只有在没有外部依赖项时才有效. (3认同)
  • 是的,这就是为什么我说要解析(即使用打开、读取和字符串匹配操作)该文件,而不是导入它。 (3认同)

Von*_*onC 23

玩弄关键词扩展时的一个经典问题;)

关键是要意识到您的标记是发布管理过程的一部分,而不是开发(及其版本控制)过程的一部分.

换句话说,您不能在开发存储库中包含发布管理数据,因为您在问题中说明了循环.

在生成程序包(即"发布管理部分")时,您需要将该信息写入您的库将查找并使用的文件(如果所述文件存在),以用于其User-Agent HTTP标头.

  • 因此,据我所知,最好只在包(tar.gz和K)中提供这个生成的version.py,同时在使用*working copy*代码时使用某种硬编码的"dev"版本号.而不是在代码控制下持有这个version.py,所以在工作副本中,但仅在生成包时暂时.对? (2认同)

Ser*_*yev 8

由于这个主题仍然存在并且有时会进入搜索结果,我想提一下最初出现在2012年的另一种解决方案,现在或多或少可用:

https://github.com/warner/python-versioneer

它的工作方式与所有提到的解决方案不同:手动添加git标记,库(和setup.py)读取标记,并动态构建版本字符串.

版本字符串包括最新标记,与该标记的距离,当前提交哈希,"肮脏"以及其他一些信息.它有几个不同的版本格式.

但它仍然没有所谓的"自定义构建"的分支名称; 当两个分支基于相同的提交时,提交距离有时会令人困惑,因此最好只标记和释放一个选定的分支(主).

  • [pandas](https://github.com/pandas-dev/pandas/blob/7d37ab85c9df9561653c659f29c5d7fca1454c67/pandas/__init__.py#L182-L188) 和 [matplotlib](https://github.com) 使用此解决方案/matplotlib/matplotlib/blob/2bdf82b7d3103271d62a8ca73d55bec7f494f12d/lib/matplotlib/__init__.py#L114-L118) (4认同)
  • [pandas](https://github.com/pandas-dev/pandas/blob/master/pandas/__init__.py#L79-L84)和[matplotlib](https://github.com)都使用此解决方案/matplotlib/matplotlib/blob/master/lib/matplotlib/__init__.py#L147-L151)。 (2认同)

dim*_*ser 8

Eric 的想法是一种简单的方法,以防万一这是有用的,这是我使用的代码(Flask 的团队是这样做的):

import re
import ast

_version_re = re.compile(r'__version__\s+=\s+(.*)')

with open('app_name/__init__.py', 'rb') as f:
    version = str(ast.literal_eval(_version_re.search(
        f.read().decode('utf-8')).group(1)))

setup(
    name='app-name',
    version=version,
 .....
)
Run Code Online (Sandbox Code Playgroud)


SeF*_*SeF 5

如果您发现versioneer过于复杂,您可以尝试凹凸2version

只需在库的根目录中添加简单的凹凸版本配置文件即可。该文件指示存储库中存储版本号的字符串的位置。然后,要更新所有指定位置的版本以进行次要版本,只需键入:

bumpversion minor
Run Code Online (Sandbox Code Playgroud)

如果您想发布补丁或主要版本,请使用patch或。major

这不仅仅与凹凸版本有关。还有其他标志选项和配置选项,例如自动标记存储库,您可以查看官方文档。