RPM包的版本号比较
版本号表示格式为 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 包的版本号比较是如何的了。
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,因为数字比字符串新
RPM包的版本号比较的更多相关文章
- 烂泥:Linux源码包制作RPM包之Apache
本文由秀依林枫提供友情赞助,首发于烂泥行天下 公司服务器比较多,需要把apache源码包制作成rpm包,然后放到公司内网yum源上进行下载安装.apache的rpm包安装方式比源码安装方式比较快,这能 ...
- nginx-1.8.0 rpm包制作
1.安装rpm-build # yum install rpm-build 2.创建制作RPM包目录 # cat /root/.rpmmacros %_topdir /root/rpmbuild %_ ...
- RPM包管理命令rpm
RPM包管理器是Linux系统中最早的软件包管理软件之一,也是目前最流行的软件包管理器,许多发行版都使用RPM作为默认的软件包管理软件. RPM软件包名称格式: samba-client-3.0.33 ...
- RPM包的制作
RPM包的制作 前言 按照其软件包的格式来划分,常见的Linux发行版主要可以分为两类,类ReadHat系列和类Debian系列,这两类系统分别提供了自己的软件包管理系统和相应的工具. 类RedHat ...
- rpm包制作(待实验)
作者:firefoxbug 时间:July 18, 2014 rpm包命名规范 对于rpm包的命名符合如下规范. %{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}.rpm N ...
- CentOS 下 rpm包与 yum 安装与卸载
rpm包的安装: 1.安装一个包 # rpm -ivh 2.升级一个包 # rpm -Uvh 3.移走一个包 # rpm -e 4.安装参数 --force 即使覆盖属于其它包的文件也强迫安 ...
- 根据某个文件或文件夹自制rpm包
首先安装打包软件# yum install rpmbuild rpmdevtools -y 生成打包路径1.使用rpmdev-setuptree ,会自动在用户家目录生成一个rpmbuild的文件夹 ...
- linux查看rpm包创建的所有目录和文件
有不少时候,我们需要查看某个rpm创建的所有目录和文件,出于了解程序结构或者其他目的,但是对于这个rpm包我们又不怎么熟悉,这个时候可以通过rpm -ql rpm名称查看. 但是rpm名称有可能又忘了 ...
- 安装 RPM 包或者安装源码包
安装 RPM 包或者安装源码包 在windows下安装一个软件很轻松,只要双击.exe的文件,安装提示连续“下一步”即可,然而linux系统下安装一个软件似乎并不那么轻松了,因为我们不是在图形界面下. ...
随机推荐
- YTKNetwork源码详解
本篇是第三篇关于网络请求的,将讲述YTKNetwork源码,上述两篇分别讲述AFNetworking源码解析以及结合自己项目封装AFNetworking. AFNetworking源码解析:https ...
- [转]git commit之后,想撤销commit
本文转自:http://www.cnblogs.com/lfxiao/p/9378763.html 写完代码后,我们一般这样 git add . //添加所有文件 git commit -m &quo ...
- 第一册:lesson thirteen.
原文:A new dress. A:What color's your new dress? B:It' green.Come upstairs and see it. A:Thank you. B: ...
- 第一册:lesson 11.
原文:Is this your shirt? A:Whose shirt is that? Is this your shirt B? B:NO,sir. It's not my shirt.This ...
- 各个模式的accesstoken续期详解
一些预备知识 jwt的时间格式 转换为时间可以用js, new Date(1531841745*1000) ==>Tue Jul 17 2018 23:35:45 GMT+0800 (中国标准时 ...
- C#、Python中分别是怎么实现通过字符串获取实体类的值以及给实体类赋值
一.引入 最近遇到一个项目里面的功能,在给实体类赋值的时候,由于赋值字段是动态生成的,所以如果用常用的方法(直接实体类的名称.字段名=要赋的值),将会生成很多无用的代码,所以找到了一个通过反射的赋值与 ...
- UWP: 妙用自定义 Action 以简化并重用代码
相信每一位 App 开发者,在开发过程中,都会有一些代码被反复用到,比如:复制文本,打电话,发短信,发邮件,给应用添加评论等等.在项目之间复制这些代码段,实在不是一个好办法,所以大家可能会把这些代码放 ...
- [PDOException] PDO::__construct(): php_network_getaddresses: getaddrinfo failed:
执行数据迁移 php artisan migrate 报错: 网上很多资料说开启allow_open_url等其实没卵用...貌似问题出在dns上....原来数据库的配置是这样的 DB_CONNECT ...
- Mysql中的外键分析(什么是外键,为什么要用外键,添加外键,主外键关联删除)
有一个东西一直在我脑海中是个很烦的东西,但是这东西不搞清楚会阻碍自己的前进.自己做项目demo永远只能用一张表... 所以今天还是学习了下外键希望能够搞明白一些... 百度上搜索外键的作用" ...
- 查询文章的上下篇Sql语句
直接开入正题 文章内容页一般都会有上一篇和下一篇的功能: 那么查询上下篇的sql语句应该怎么写呢:示例数据表:zmd_article自增主键:id当前文章id:10 肯定有人说,这简单啊id+1和id ...