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)
你还有什么比这更复杂的事我还没理解?
Von*_*onC 23
玩弄关键词扩展时的一个经典问题;)
关键是要意识到您的标记是发布管理过程的一部分,而不是开发(及其版本控制)过程的一部分.
换句话说,您不能在开发存储库中包含发布管理数据,因为您在问题中说明了循环.
在生成程序包(即"发布管理部分")时,您需要将该信息写入您的库将查找并使用的文件(如果所述文件存在),以用于其User-Agent HTTP标头.
由于这个主题仍然存在并且有时会进入搜索结果,我想提一下最初出现在2012年的另一种解决方案,现在或多或少可用:
https://github.com/warner/python-versioneer
它的工作方式与所有提到的解决方案不同:手动添加git标记,库(和setup.py)读取标记,并动态构建版本字符串.
版本字符串包括最新标记,与该标记的距离,当前提交哈希,"肮脏"以及其他一些信息.它有几个不同的版本格式.
但它仍然没有所谓的"自定义构建"的分支名称; 当两个分支基于相同的提交时,提交距离有时会令人困惑,因此最好只标记和释放一个选定的分支(主).
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)
如果您发现versioneer过于复杂,您可以尝试凹凸2version。
只需在库的根目录中添加简单的凹凸版本配置文件即可。该文件指示存储库中存储版本号的字符串的位置。然后,要更新所有指定位置的版本以进行次要版本,只需键入:
bumpversion minor
Run Code Online (Sandbox Code Playgroud)
如果您想发布补丁或主要版本,请使用patch
或。major
这不仅仅与凹凸版本有关。还有其他标志选项和配置选项,例如自动标记存储库,您可以查看官方文档。
归档时间: |
|
查看次数: |
19729 次 |
最近记录: |