【发布时间】:2019-10-24 22:13:48
【问题描述】:
使用由pbr git repo 标签生成的版本
我在从我的包中获取版本信息时遇到问题,该包使用setuptools 和pbr 扩展名设置为普通Python 包。 pbr 将从 git repo 中的标签中提取版本信息,因此有一个单一的事实来源。
我确实掌握了基础知识 - see this Q&A for more info。
如果我对包进行完整分发,它可以整体工作。例如:py setup.py sdist 将创建一个完整的发行版,并更新来自 git 的版本标签和其他元数据。
但是我不需要这个包的完整分发,我的团队只是在本地从一个 git 存储库中处理它。我还使用pyinstaller 创建用于用户分发的主脚本的可执行文件(不需要 Python)。所以我想要一个简单、快速的命令,它只会根据 git 存储库的最新更新来更新元数据,而无需花费额外的时间让 SetupTools 构建和创建完整的分发包,无论如何都不会使用它。
pbr 将从 repo 中提取版本(来自标签)、作者和更改日志信息,因此可以节省大量时间,让我们可以将大部分元数据直接保存在 git 中。
问题
我们可以做些什么来使用pbr 更新包元数据,而无需进行完整分发?
特别是版本:
-
setup.py使用pbr扩展名的命令何时或使用哪些命令实际上会从 git 存储库更新版本,以便任何查询版本的命令都将获得更新的版本? - 此设置中实际存储的版本在哪里? (我找不到...)
更多信息和一些代码
我有一个很短的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')
以上所有都返回 old 版本字符串(上次进行完整分发)。
那么,除了py setup.py sdist 或类似的完整分发构建命令(bdist、bdist_egg 等),我还能做些什么来简单地更新我的包信息,这样上述方法就会给我最新的版本字符串运行主包脚本时还有其他 git 元数据?
这将允许我们在签出新提交后作为开发人员在本地更新包,然后运行 pyinstaller 来创建我们的 exe 并发布我们的最终用户版本的脚本。
【问题讨论】:
-
我不得不提到
import importlib.metadata; __version__ = importlib.metadata.version('Example'),因为它在standard library since Python 3.8 中。它可以防止在setuptools或pbr上存在运行时依赖项 (install_requires)。 -
我在某处看到并尝试过,但没有成功。我只在 3.7.4... 可能值得更新以尝试一下。我仍然无法让
pkg_resources方法与pyinstaller一起使用...感谢您的提示。 -
有一个 backport called importlib-metadata 可以缓解过渡,但它只是将依赖关系换成另一个。
-
仅供参考,我得到了
importlib-metadata使用 Python 3.8.0,但 PyInstaller 无法成功编译我的包,所以我又回到了 Python 3.7。我相信所有其他信息和步骤仍然是必需的,因此虽然这提供了一种更简洁的方法来访问脚本中的元数据,但它目前只是一个不错的选择,我目前无法使用。跨度>
标签: python versioning setuptools python-pbr