为了发布一些软件的几个不同版本的 RPM 包,我正在寻找一种方法来指定被认为是“升级”的版本“数字”,并包括几个预发布版本的区别,例如(按顺序): "2.4.0 alpha 1", "2.4.0 alpha 2", "2.4.0 alpha 3", "2.4.0 beta 1", "2.4.0 beta 2", "2.4.0 release candidate", “2.4.0 最终版本”、“2.4.1”、“2.4.2”等。
我遇到的主要问题是 RPM 认为“2.4.0”早于“2.4.0.alpha1”,所以我不能只在最终版本号的末尾添加后缀。
我可以尝试“2.4.0.alpha1”、“2.4.0.beta1”、“2.4.0.final”,这会起作用,除了“release candidate”晚于“2.4.0.final” ”。
我考虑的另一种方法是使用 RPM 版本号的“纪元:”部分(纪元:前缀被认为在主版本号之前,因此“1:2.4.0”实际上早于“2:1.0.0”) . 通过在 epoch: 字段中放置时间戳,所有版本都按照 RPM 的预期进行排序,因为它们的版本似乎随时间递增。但是,当同时在几个主要版本上发布新版本时,这会失败(例如,2.3.2 在 2.4.0 之后发布,但它们的 RPM 版本是“20121003:2.3.2”和“20120928:2.4”。 0”和 2.3.2 上的系统无法“升级”到 2.4.0,因为 rpm 将其视为旧版本)。在这种情况下,yum/zypper/etc 拒绝升级到 2.4.0,这就是我的问题。
我可以使用什么版本号来实现这一点,并确保 RPM 始终认为版本号是有序的。或者如果不是版本号,RPM 打包中的其他机制?
注意 1:我想保留 spec 文件的“Release:”字段用于它的原始目的(多个版本的包,包括包装更改,用于相同版本的打包软件)。
注意 2:这应该适用于主要发行版的当前生产版本,例如 RHEL/CentOS 6 和 SLES 11。但我对不适用的解决方案也很感兴趣,只要它们不涉及重新编译 rpm!
注意 3:在类 Debian 系统上,dpkg 在版本号中使用一个特殊的组件,即“~”(波浪号)字符。这会导致 dpkg 将后缀计为“负”顺序,因此“2.4.0~anything”将排在“2.4.0”之前。然后,在“~”之后应用正常排序,因此“2.4.0~alpha1”出现在“2.4.0~beta1”之前,因为“alpha”按字母顺序出现在“beta”之前。我不一定要为 RPM 包使用相同的方案(我很确定不存在这样的等价物),所以这只是 FYI。
Fedora 有一套用于设置预发布包的版本/发布号的指南。基本上,您使用 中最终版本的版本号,并以、递增数字
Version
开头,然后是 ,或其他任何内容。您根本不会在最终版本中使用字母数字标签。Release
0.
alpha
beta
final
请注意,您不能指望 RPM 支持 Debian 风格波浪号版本控制。多个发行版禁用此功能。
官方 rpm 指南告诉你如何做到这一点,并链接到示例页面。下面是一个示例,说明如何使用非常常见的版本控制方案,该方案使用三个级别的预发布 (a、b、rc)(不幸的是,rpm 使其支持起来有点复杂):
我不喜欢 alpha/beta 区别。有已发布代码和未发布代码。
我是怎么做的:我喜欢带有持续集成系统的 major.minor.build(参见 JenkinsCI)。构建整数永远不会重置。次要版本号更改是为了向后兼容更改。重大数字变化是大事。
如果市场营销不喜欢“构建”是大整数,您可以仅在已发布的构建上增加次要数字一次以进行市场营销,然后在进入工程时再次增加。
我遇到了类似的问题,我不得不比较 RedHat、Debian、Python 包和 Ruby gems 之间的修订以统一套件号,这帮助我评估每种情况下的“大于”和“小于”:
这是将 1.3.0.post0.dev20180213210433 与 1.3.0 进行比较,YMMV
对于 Red Hat(感谢https://utcc.utoronto.ca/~cks/space/blog/linux/RPMShellVersionComparison)
对于 Debian:
对于 Python
对于红宝石
从版本 4.10.0 开始,RPM 正式支持问题中提到的 dpkg 样式波浪号编号。
https://rpm.org/wiki/Releases/4.10.0