2012-12-04 33 views
0

我只是想弄清楚RPM如何识别某些软件包的最新版本。 说我有:RPM包中最新版RPM包的识别过程是什么?

package-0.1-SNAPSHOT201212031 
package-0.2-SNAPSHOT201212030 

威尔转经理它只是比较字符串或有是它背后的一些更多的逻辑?或者另一个例子:它会认识到0.10.1比0.1.1更新吗? (字符串比较在这里没有帮助)。

回答

1

在RELEASE字段中,唯一的硬性和快速规则是没有破折号

考虑:

rpm -qi hwdata 

其次

$ rpm -q hwdata --queryformat '%10{NAME} %20{VERSION} %20{RELEASE} %20{ARCH}\n' 
hwdata    0.213.22    1.el5    noarch 

请参阅本文档的The Release Tag部分用于发行标签规则的参考。

注意:作为参考,如果在spec文件中没有rpm-tag,有时我会编程地将东西填充到rpm描述中。你的里程可能会有所不同,而且我不推荐这样的套餐,因为它很尴尬,因此它们一定会回到社区。只是指出它是一种解决方法,以避免制动各种工作在rpm上的工具。注释2:在RELEASE字段中使用修订控制编号是一种常见操作。虽然这有点违反了rpm协议。 (修改该字段,意味着spec文件改变了......而不是内容)这是一个方便的字段,因为它不会中断任何rpm工具,并且可以直接引用内容版本。另外...如果你的rpm内容被检入到一个版本控制系统中,那么它已经在rpm模型之外进行了一些改动。 I.E.源代码转速变得不必要。

0

旧帖子,但我一直在试图弄明白,我想分享什么是我的工作。 我正在使用一个ruby脚本,并对String类进行了扩展。

class String 
    def explode 
    self.split(/-|_|\./).collect {|i| if i == "0" || i.to_i > 0; then i = i.to_i; end; i} 
    end 
end 

这打破一个给定的字符串转换成一个阵列,其中一组号码被转换成一个可排序的数字值(而不是被保留为一个字符串)。

例如:

ruby -r./string_ext.rb -e ' puts %Q{package-0.1-SNAPSHOT201212031}.explode.inspect' 
#=> ["package", 0, 1, "SNAPSHOT201212031"] 

ruby -r./string_ext.rb -e ' puts %Q{package-0.2-SNAPSHOT201212031}.explode.inspect' 
#=> ["package", 0, 2, "SNAPSHOT201212031"] 

# the comparison of the resulting arrays is then very straight forward 
ruby -r./string_ext.rb -e ' puts %Q{package-0.1-SNAPSHOT201212031}.explode <=> %Q{package-0.2-SNAPSHOT201212030}.explode' 
#=> -1 

其中-1表示的第一项是小于第二,0意味着它们是相等的,和1意味着,第二项小于第一个。

1 <=> 2 #=> -1 
2 <=> 2 #=> 0 
3 <=> 2 #=> 1 

使用这种方法是非常简单的,以收集来自类似项目的阵列(如具有相同的包相关联的rpm的阵列)的最大价值。