我只想弄清楚RPM如何识别某个软件包的最新版本。 说我有:
package-0.1-SNAPSHOT201212031
package-0.2-SNAPSHOT201212030
rpm管理员会将它作为字符串进行比较,还是会有更多的逻辑? 或者另一个例子:它会认识到0.10.1比0.1.1更新吗? (字符串比较在这里没有用)。
答案 0 :(得分:1)
唯一的硬性规则是RELEASE字段中可以有 no dashes 。
考虑:
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部分。
注意:作为参考,如果specfile中没有rpm-tag,有时我会将程序化内容填充到rpm描述中。你的里程可能会有所不同,我并不建议将这个用于返回社区的包裹,因为它很尴尬。只是指出它作为一种解决方法,以防止制动在rpm上运行的各种工具。
注意2:在RELEASE字段中使用版本控制号是一种常见做法。虽然这有点突破rpm惯例。 (修改该字段,意味着specfile已更改...而不是内容)这是一个方便使用的字段,因为它不会破坏任何rpm工具,并为您提供对内容版本的直接引用。另外......如果您已将rpm内容签入到修订控制系统中,则无论如何这已经超出了rpm模型的范围。 I.E.源rpm变得不必要了。
答案 1 :(得分:0)
老帖子,但我一直在努力让这个被钉死,并认为我会分享我的工作内容。 我正在使用带有String类扩展名的ruby脚本。
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
使用这种方法,从类似项目的数组中收集最大值非常简单(例如与同一个包相关联的rpms数组)。