【问题标题】:How to update git metadata in a Python Packages using Setuptools and PBR如何使用 Setuptools 和 PBR 更新 Python 包中的 git 元数据
【发布时间】:2019-10-24 22:13:48
【问题描述】:

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

我在从我的包中获取版本信息时遇到问题,该包使用setuptoolspbr 扩展名设置为普通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 更新包元数据,而无需进行完整分发?

特别是版本:

  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 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 中。它可以防止在 setuptoolspbr 上存在运行时依赖项 (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


【解决方案1】:

版本信息似乎存储在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 等。有关更多可用的 setup.py 命令,请参阅py setup.py --help-commands


作者和变更日志

虽然上述情况适用于版本控制,但 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 代替)

【讨论】:

  • 它不适用于python3 setup.py develop 吗?如果是这样,那么在我看来,它是您应该使用的,因为它更接近您真正想要做的事情。无需构建发行版。
  • 我试过了,develop 确实运行了egg_info,但没有更新AUTHORSChangeLog(很遗憾)。我更新了答案。这感觉像是对pbr...的一个很好的增强请求...
猜你喜欢
  • 2020-02-17
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
  • 2019-10-08
相关资源
最近更新 更多