0

使用从 git repo 标签生成的版本pbr

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

我确实掌握了基础知识 -请参阅此问答了解更多信息

如果我完整分发软件包,它总体上是有效的。例如:py setup.py sdist将创建一个完整的发行版,并更新来自 git 的版本标签和其他元数据。

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

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

问题

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

特别是在版本上:

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

更多信息和一些代码

我有一个很短的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 并发布我们的最终用户版本的脚本。

4

1 回答 1

1

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

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

Version: 2.0.4.0b2

pkg_resources直接在 PKG-INFO 文件中更新版本字符串确实会导致脚本在通过或访问时显示更新的字符串pbr.version

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

py setup.py egg_info

也会更新信息的更长/更复杂的命令包括buildsdistbdistpy setup.py --help-commands。更多可用setup.py命令请参见。


作者和变更日志

虽然以上对于版本控制是正确的,但pbr 不会为or命令更新AUTHORSand文件。ChangeLogegg_infobuild

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

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

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

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

于 2019-10-24T22:27:12.167 回答