对于我正在从事的 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