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

时间:2019-10-24 22:13:48

标签: python versioning setuptools python-pbr

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

我在从软件包中获取版本信息时遇到了问题,该软件包使用扩展名为setuptools的{​​{1}}设置为普通的Python软件包。 pbr将从git repo中的标签中提取版本信息,因此只有一个事实来源。

我确实掌握了基础知识-see this Q&A for more info

如果我完整分发软件包,它总体上可以正常工作。例如:pbr将创建完整发行版,并且git中的version标签和其他元数据将被更新。

但是我不需要此软件包的完整发行版,我的团队只是从git repo本地进行开发。我还使用py setup.py sdist创建主脚本的可执行文件以供用户分发(不需要Python)。因此,我想要一个简单,快速的命令,该命令将根据git repo的最新更新来更新元数据,而无需花费额外的时间来让SetupTools生成和创建完整的分发程序包,而该程序包将永远不会使用。

pyinstaller将从存储库中提取版本(从标签),作者和变更日志信息,因此节省了很多时间,使我们可以将大多数元数据直接保留在git中。

问题

我们是否可以做任何事情来获取包元数据以pbr更新,而无需进行完整分发?

特别是版本:

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

更多信息和一些代码

我有一个简短的pbr,可与setup.py扩展名一起使用:

pbr

现在,如果我使用标签更新git repo中的最新提交,则命令#!/usr/bin/env python from setuptools import setup setup( setup_requires=['pbr', 'setuptools'], pbr=True, ) 将基于该标签返回新的更新版本,但是我可以找到的任何其他直接方法仍会返回旧的版本字符串。因此,该命令似乎不会在任何地方存储新版本字符串。

以下是我从软件包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') 还是类似的完整发行版构建命令(bdist,bdist_egg等)之外,我能做些什么来简单地更新我的软件包信息,以便上述方法为我提供最新的信息。主程序包脚本运行时版本字符串和其他git元数据?

这将使我们能够在签出新提交后以开发人员身份在本地更新软件包,然后运行py setup.py sdist创建我们的exe并释放脚本的最终用户版本。

1 个答案:

答案 0 :(得分:1)

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

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

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更新所有元数据,这是完整发行版构建命令之一。

生成命令和ChangeLog文件的命令:

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

(注意:我使用最近的py命令来运行python,该命令可让您设置运行python的默认环境,但您可能需要使用python或{{ 1}}代替)