Chinaunix首页 | 论坛 | 博客
  • 博客访问: 110980
  • 博文数量: 37
  • 博客积分: 85
  • 博客等级: 民兵
  • 技术积分: 370
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-22 16:07
文章分类

全部博文(37)

文章存档

2014年(17)

2013年(17)

2012年(3)

我的朋友

分类: LINUX

2014-05-27 17:49:03

最近在网络上查了下 rpm 包的版本是如何比较的,发现这方面的资料比较少,尤其是中文的 rpm 包的版本号比较 - nihui - Nihuis Blog
这个问题对于发行版的开发人员比较重要,到底那个包比那个包新,版本控制,指定依赖关系等都需要用到的。
        好了,废话不多说。
版本号表示格式为 epoch:version-release,例如 1:2-3

第一条原则是 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/
阅读(3076) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~