代码之家  ›  专栏  ›  技术社区  ›  LightCC

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

  •  0
  • LightCC  · 技术社区  · 6 年前

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

    我在从我的包中获取版本信息时遇到问题,该包被设置为使用 setuptools pbr公司 分机。 pbr公司 将从git repo中的标记中提取版本信息,因此只有一个真相来源。

    我做了一些基本的工作- see this Q&A for more info .

    总的来说,如果我把包裹分发得很好的话。例如: py setup.py sdist 将创建一个完整的发行版,更新git的版本标记和其他元数据。

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

    pbr公司 将从repo中提取版本(来自标记)、作者和变更日志信息,因此这是一个大的时间节省器,允许我们将大部分元数据直接保存在git中。

    问题

    我们可以做些什么来更新包元数据吗 pbr公司 ,而不是完全分发?

    尤其是在版本上:

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

    更多信息和一些代码

    我有一个很短的 安装程序.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设置.py sdist 或者类似的完整发行版构建命令(bdist,bdist_egg,等等)来简单地更新我的包信息,以便在运行主包脚本时,上面的方法会给我最新版本的字符串和其他git元数据?

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   LightCC    6 年前

    版本信息似乎存储在 package.egg-info/PKG-INFO 文件。因此,任何 setuptools 更新egg信息的命令将拉入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 建造 命令。

    但是,这些文件是在 sdist公司 B列表 命令(包括 B列表 ,我想)。因此,看起来仍然需要更新Git中的所有元数据—需要一个完整的发布构建命令。

    命令将 生成作者和更改日志文件:

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

    (注:我使用最近的 py python python3 相反)