0

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

package-0.1-SNAPSHOT201212031
package-0.2-SNAPSHOT201212030

rpm 管理器会将其作为字符串进行比较,还是背后有更多逻辑?或者另一个例子:它会识别出 0.10.1 比 0.1.1 更新吗?(字符串比较在这里没有帮助)。

4

2 回答 2

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 变得不必要了。

于 2012-12-04T15:51:16.667 回答
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

使用这种方法很容易从一组相似的项目中收集最大的价值(比如与同一个包关联的 rpm 数组)。

于 2015-03-04T01:24:30.083 回答