如何使用 Setuptools 和 PBR 更新 Python 包中的 git 元数据

How to update git metadata in a Python Packages using Setuptools and PBR

使用 pbr

从 git 回购标签生成的版本

我在从我的包中获取版本信息时遇到问题,该包被设置为使用 setuptoolspbr 扩展名的普通 Python 包。 pbr 将从 git 存储库中的标签中提取版本信息,因此只有一个真实来源。

我确实掌握了基础知识 -

整体工作,如果我对包进行完整分发。例如:py setup.py sdist 将创建一个完整的发行版,并更新来自 git 的版本标签和其他元数据。

但我不需要这个包的完整分发版,我的团队只是在 git 存储库中在本地处理它。我还使用 pyinstaller 创建用于用户分发的主脚本的可执行文件(不需要 Python)。所以我想要一个简单、快速的命令,它只会根据 git 存储库的最新更新来更新元数据,而无需花费额外的时间让 SetupTools 构建和创建完整的分发包,无论如何都不会使用.

pbr 将从 repo 中提取版本(来自标签)、作者和变更日志信息,因此可以节省大量时间,让我们可以将大部分元数据直接保存在 git 中。

问题

我们可以做些什么来让包元数据更新为 pbr,而无需进行完整分发?

特别是版本:

  1. 何时或使用哪些命令 setup.py 使用 pbr 扩展实际上会从 git 存储库更新版本,以便查询版本的任何命令都将获得更新版本?
  2. 此设置中实际存储的版本在哪里? (找不到了...)

更多信息和一些代码

我有一个非常短的 setup.py,用于 pbr 扩展名:

#!/usr/bin/env python

from setuptools import setup
setup(
    setup_requires=['pbr', 'setuptools'],
    pbr=True,
)

现在,如果我用标签更新 git 仓库中的最新提交,命令 py setup.py --version 将 return 基于该标签的新更新版本,但任何其他我可以找到的直接方法仍然会 return 旧版本字符串。因此该命令似乎不会在任何地方存储新版本字符串。

这是我从我的包中尝试过的一些方法 __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')

以上所有 return 版本字符串(上次进行完整分发时)。

所以,除了 py setup.py sdist 或类似的完整分发构建命令(bdist、bdist_egg 等)之外,我还能做些什么来简单地更新我的包信息,所以上面当主包脚本是 运行?

时,方法会给我最新版本的字符串和其他 git 元数据

这将允许我们在签出新提交后作为开发人员在本地更新包,然后 运行 pyinstaller 创建我们的 exe 并发布我们的脚本的最终用户版本。

版本信息似乎存储在 package.egg-info/PKG-INFO 文件中。因此,任何更新 egg-info 的 setuptools 命令都会引入 git 信息。

PKG-INFO 文件中,版本当前显示在第 3 行:

Version: 2.0.4.0b2

直接在 PKG-INFO 文件中更新版本字符串确实会导致脚本在通过 pkg_resourcespbr.version.

访问时显示更新后的字符串

让 PBR 自动更新 .egg-info 文件夹中的元数据的最快命令似乎是:

py setup.py egg_info

更长/更复杂的命令也会更新信息,包括 buildsdistbdist 等。请参阅 py setup.py --help-commands 了解更多可用信息 setup.py命令。


作者和更新日志

虽然以上内容适用于版本控制,但 AUTHORSChangeLog 文件不会由 pbr 为 egg_infobuild 命令更新。

但是,这些文件是在 sdistbdist 命令期间生成的(我认为包括 bdist 的所有版本)。所以它看起来仍然需要从 Git 更新所有元数据,其中一个完整的分发构建命令是必需的。

不会生成 AUTHORS 和 ChangeLog 文件的命令:

py setup.py egg_info
py setup.py build
py setup.py develop

(注意:我使用相当新的 py 命令来 运行 python,它允许您为 运行 设置默认环境宁 python,但您可能需要使用 pythonpython3 代替)