RPM包版本号比较


最近在网络上查了下 rpm 包的版本是如何比较的,发现这方面的资料比较少,尤其是中文的 rpm 包的版本号比较 - nihui - Nihuis Blog
这个问题对于发行版的开发人员比较重要,到底那个包比那个包新,版本控制,指定依赖关系等都需要用到的。
         好了,废话不多说。
版本号表示格式为 epoch:version-release,例如 1:2-3 通常情况下epoch不会显示在rpm包的名字里,可以通过下面的命令来查看epoch的值。
$rpm -q xxx.rpm --queryformat '%{EPOCH}\n'


第一条原则是 rpm 属性优先级 epoch > version > release

        两个 rpm 包比较时,先看两者的 epoch 哪个新,如果 epoch 相等,再看 version 哪个新,如果 version 还相等,最后看 release 哪个新,要是 release 也相等,那么这两个 rpm 包的版本是相等的。
0:1-2 > 0:1-1
0:2-1 > 0:1-3
1:1-1 > 0:2-2

第二条原则是版本号字段列表分隔模式

         epoch 属性之外,version 和 release 可能不单单包含数字,也可能含有字符串,例如 1.0alpha1、2.0.0+svn12221
         遇到这种情况时,版本号字段会被分隔为列表。分隔策略是数字与字符串分开,形成自然分隔边界,点号/加号/减号/下划线作为分隔符。1.0alpha1 会分为 [ 1、0、alpha、1 ],2.0.0+svn12221 会分为 [ 2、0、0、svn、12221 ]。这样子分隔的目的是为了列表相应分段进行比较,比较的优先级按照列表的下标顺序自然排序,第一位的优先级最高,后面依次降低。如果两个列表可比较的分段经过比较后都相等,那么列表长的比列表短的新,如果列表长度也一样,那么这两个版本号字段相等。
1.2.0 > 1.1.9            ( [1,2,0] 中第2分段的“2” > [1,1,9] 中第2分段的“1” )
1.12.1 > 1.9beta2   ( [1,12,1] 中第2分段的“12” > [1,9,beta,2] 中第2分段的“9” )
3.1.0 > 3.1               ( [3,1,0] 的列表长度3 > [3,1] 的列表长度2 )

第三条原则是列表分段比较算法
         具体的算法应用于两个待比较的分段串,由于第二条原则的关系,这里的串只可能都是数字或都是字母,例如 "12"、"abc"、"BETA"
         如果是数和数比较,那么两个串会看作两个整数进行自然数比较,前导的零会被忽略,"12" -> 12,"00010" -> 10。
         如果是字符串和字符串比较,那么会进行如同 C 语言 strcmp() 函数的逻辑,按照 ACSII 码顺序得出,排在后面的为新版本,小写字母比大写字母新。
         如果是字符串和数比较,那么认定数比字符串新。
123 > 121
svn > rc
alpha > Beta
0 > beta

         最后给出一些例子,应该足够说明 rpm 包的版本号比较是如何的了 rpm 包的版本号比较 - nihui - Nihuis Blog
1.00010 > 1.9,因为 10 > 9
2.02 = 2.2,因为 02 = 2
3.4.0 > 3.4,因为 3.4.0 多出一个列表分段
5mgc25 = 5.mgc.25,因为分隔后的列表两者相等
6.0 > 6beta,因为数字比字符串新

转自:http://shuizhuyuanluo.blog.163.com/blog/static/778181201051972214868/
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值