使用从 git repo 标签生成的版本pbr
我在从我的包中获取版本信息时遇到问题,该包设置为setuptools
与pbr
扩展一起使用的普通 Python 包。pbr
将从 git repo 中的标签中提取版本信息,因此有一个单一的事实来源。
我确实掌握了基础知识 -请参阅此问答了解更多信息。
如果我完整分发软件包,它总体上是有效的。例如:py setup.py sdist
将创建一个完整的发行版,并更新来自 git 的版本标签和其他元数据。
但是我不需要这个包的完整发行版,我的团队只是在本地从一个 git repo 中处理它。我还pyinstaller
用于创建用于用户分发的主脚本的可执行文件(不需要 Python)。所以我想要一个简单、快速的命令,它只会根据 git 存储库的最新更新来更新元数据,而无需花费额外的时间让 SetupTools 构建和创建完整的分发包,无论如何都不会使用它。
pbr
将从 repo 中提取版本(来自标签)、作者和更改日志信息,因此可以节省大量时间,使我们可以将大部分元数据直接保存在 git 中。
问题
我们可以做些什么来更新包元数据pbr
而不进行完整分发?
特别是在版本上:
- 何时或使用哪些命令将
setup.py
使用pbr
扩展实际从 git repo 更新版本,以便任何查询版本的命令都将获得更新的版本? - 此设置中实际存储的版本在哪里?(我找不到……)
更多信息和一些代码
我有一个很短的setup.py
,用于pbr
扩展:
#!/usr/bin/env python
from setuptools import setup
setup(
setup_requires=['pbr', 'setuptools'],
pbr=True,
)
现在,如果我使用标签更新 git repo 中的最新提交,该命令py setup.py --version
将返回基于该标签的新更新版本,但我能找到的任何其他直接方法仍将返回旧版本字符串。因此,该命令似乎不会将新版本字符串存储在任何地方。
这是我从我的包中尝试过的一些方法__init__.py
:
import pkg_resources # part of setuptools
v1 = pkg_resources.require("md2mat")[0].version
print('v1 {}'.format(v1))
v2 = pkg_resources.get_distribution('md2mat').version
print('v2 {}'.format(v2))
from pbr.version import VersionInfo
v3 = VersionInfo('md2mat').release_string()
print('v3 {}'.format(v3))
# Update per sinoroc's comment:
# As of Python 3.8, you can use this from the stdlib,
# which removes run-time dependencies on `pbr` or `setuptools`
import importlib.metadata
__version__ = importlib.metadata.version('Example')
以上所有内容都返回旧版本字符串(上次进行完整分发)。
那么,有没有什么我可以做的py setup.py sdist
或者类似的完整分发构建命令(bdist、bdist_egg 等)来简单地更新我的包信息,所以上述方法会给我最新的版本字符串和其他 git 元数据。主包脚本运行?
这将允许我们在签出新提交后作为开发人员在本地更新包,然后运行pyinstaller
以创建我们的 exe 并发布我们的最终用户版本的脚本。