在RPM存储库中识别RPM软件包最新版本的过程是什么?

时间:2012-12-04 00:23:42

标签: linux redhat rpm

我只想弄清楚RPM如何识别某个软件包的最新版本。 说我有:

package-0.1-SNAPSHOT201212031
package-0.2-SNAPSHOT201212030

rpm管理员会将它作为字符串进行比较,还是会有更多的逻辑? 或者另一个例子:它会认识到0.10.1比0.1.1更新吗? (字符串比较在这里没有用)。

2 个答案:

答案 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数组)。