如何使用 setup.py 和 debian/control 将版本号保存在 Python 项目中的单个位置

如何使用 setup.py 和 debian/control 将版本号保存在 Python 项目中的单个位置

对于我正在从事的 Python 项目,我想要:

  • 将版本字符串保存在一个地方。
  • 能够在运行时获取版本字符串以用于日志记录目的
    • 从源分支启动代码时获取默认值。
    • 获取取决于用于构建源包的分支的 bzr 修订号的值。
  • 使用以下方式使项目包在启动板 PPA 中可用:食谱

代码现在的工作方式是:

  • 版本号位于debian/changelog
  • 在构建源包时,启动板中的配方会添加开发分支的修订号。
  • 中的函数setup.py解析第一行以debian/changelog检索版本号并将其传递给setup以便setup --version正常工作(没有修订号,但可以修复)。

但是,运行时无法获取版本号。有什么好方法可以做到这一点并满足上述要求?

我过去使用过/见过的一些解决方案是基于version.py在构建时从模板生成模块:

  • 使用外部工具

    使用工具/命令生成version.py具有版本号的模块。但是,这不适用于启动板配方,因为在配方中运行任意命令的能力是在启动板中已禁用

  • setup.py

    我见过一个项目,它通过子类化distutils.command.install_data.install_data来动态执行一些字符串替换。但是代码的可读性不强,所以我更愿意使用其他策略。

除此之外,我还习惯于python-apt查询 apt 缓存中已安装的软件包版本以获取版本字符串。但是,当从源分支启动代码时,这不会显示默认值,除非未安装软件包或添加了一些路径检查代码,在我看来,这不是很干净。

我已经阅读过其他问题,例如:

但他们并没有真正解决同时处理打包和版本控制的问题。

请让我知道什么是合理的方法来实现这一点,并提供使用该方法的示例项目的链接(如果可能)。

答案1

工具/命令用于生成带有版本号的 version.py 模块。但是,这不适用于启动板配方,因为在启动板中禁用了在配方中运行任意命令的功能。

当然,您可以在构建时执行此操作,而不是在创建源包时执行此操作。

version.py

# Overwritten during Debian packaging build
package_version="unknown"

debian/rules

override_dh_auto_build:
        dpkg-parsechangelog | sed -rne 's,^Version: (.*),package_version="\1", p' > version.py
        dh_auto_build

debian/clean

version.py

相关内容