我只是想弄清楚 RPM 如何识别某些软件包的最新版本。说我有:
package-0.1-SNAPSHOT201212031
package-0.2-SNAPSHOT201212030
rpm 管理器会将其作为字符串进行比较,还是背后有更多逻辑?或者另一个例子:它会识别出 0.10.1 比 0.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
有关发布标签规则的参考,请参阅本文档的发布标签部分。
注意:作为参考,如果规范文件中没有rpm 标记,有时我会以编程方式将内容填充到 rpm 描述中。您的里程可能会有所不同,对于注定要回到社区的包裹,我不建议这样做,因为这很尴尬。只是指出它是一种解决方法,以防止制动在 rpm 上运行的各种工具。
注意 2:在 RELEASE 字段中使用修订控制编号是一种常见的做法。虽然这有点违反 rpm 约定。(修改该字段,意味着 specfile 更改了...不是内容)这是一个方便使用的字段,因为它不会破坏任何 rpm 工具,并为您提供对内容版本的直接引用。另外...如果您将 rpm 内容签入修订控制系统,那么无论如何这已经超出了 rpm 模型。IE 源 rpm 变得不必要了。
旧帖子,但我一直在努力解决这个问题,并认为我会分享我的工作方式。我正在使用带有 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
使用这种方法很容易从一组相似的项目中收集最大的价值(比如与同一个包关联的 rpm 数组)。