如何使用 Setuptools 和 PBR 更新 Python 包中的 git 元数据
How to update git metadata in a Python Packages using Setuptools and PBR
使用 pbr
从 git 回购标签生成的版本
我在从我的包中获取版本信息时遇到问题,该包被设置为使用 setuptools
和 pbr
扩展名的普通 Python 包。 pbr
将从 git 存储库中的标签中提取版本信息,因此只有一个真实来源。
我确实掌握了基础知识 - 。
它是 整体工作,如果我对包进行完整分发。例如: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 仓库中的最新提交,命令 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_resources
或 pbr.version
.
访问时显示更新后的字符串
让 PBR 自动更新 .egg-info 文件夹中的元数据的最快命令似乎是:
py setup.py egg_info
更长/更复杂的命令也会更新信息,包括 build
、sdist
、bdist
等。请参阅 py setup.py --help-commands
了解更多可用信息 setup.py
命令。
作者和更新日志
虽然以上内容适用于版本控制,但 AUTHORS
和 ChangeLog
文件不会由 pbr 为 egg_info
或 build
命令更新。
但是,这些文件是在 sdist
和 bdist
命令期间生成的(我认为包括 bdist
的所有版本)。所以它看起来仍然需要从 Git 更新所有元数据,其中一个完整的分发构建命令是必需的。
将不会生成 AUTHORS 和 ChangeLog 文件的命令:
py setup.py egg_info
py setup.py build
py setup.py develop
(注意:我使用相当新的 py
命令来 运行 python,它允许您为 运行 设置默认环境宁 python,但您可能需要使用 python
或 python3
代替)
使用 pbr
从 git 回购标签生成的版本
我在从我的包中获取版本信息时遇到问题,该包被设置为使用 setuptools
和 pbr
扩展名的普通 Python 包。 pbr
将从 git 存储库中的标签中提取版本信息,因此只有一个真实来源。
我确实掌握了基础知识 -
它是 整体工作,如果我对包进行完整分发。例如: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 仓库中的最新提交,命令 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 等)之外,我还能做些什么来简单地更新我的包信息,所以上面当主包脚本是 运行?
这将允许我们在签出新提交后作为开发人员在本地更新包,然后 运行 pyinstaller
创建我们的 exe 并发布我们的脚本的最终用户版本。
版本信息似乎存储在 package.egg-info/PKG-INFO
文件中。因此,任何更新 egg-info 的 setuptools
命令都会引入 git 信息。
在 PKG-INFO
文件中,版本当前显示在第 3 行:
Version: 2.0.4.0b2
直接在 PKG-INFO 文件中更新版本字符串确实会导致脚本在通过 pkg_resources
或 pbr.version
.
让 PBR 自动更新 .egg-info 文件夹中的元数据的最快命令似乎是:
py setup.py egg_info
更长/更复杂的命令也会更新信息,包括 build
、sdist
、bdist
等。请参阅 py setup.py --help-commands
了解更多可用信息 setup.py
命令。
作者和更新日志
虽然以上内容适用于版本控制,但 AUTHORS
和 ChangeLog
文件不会由 pbr 为 egg_info
或 build
命令更新。
但是,这些文件是在 sdist
和 bdist
命令期间生成的(我认为包括 bdist
的所有版本)。所以它看起来仍然需要从 Git 更新所有元数据,其中一个完整的分发构建命令是必需的。
将不会生成 AUTHORS 和 ChangeLog 文件的命令:
py setup.py egg_info
py setup.py build
py setup.py develop
(注意:我使用相当新的 py
命令来 运行 python,它允许您为 运行 设置默认环境宁 python,但您可能需要使用 python
或 python3
代替)