Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在RPM存储库中识别RPM包最新版本的过程是什么?_Linux_Redhat_Rpm - Fatal编程技术网

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

Linux 在RPM存储库中识别RPM包最新版本的过程是什么?,linux,redhat,rpm,Linux,Redhat,Rpm,我只是想弄清楚RPM是如何识别某些软件包的最新版本的。 假设我有: package-0.1-SNAPSHOT201212031 package-0.2-SNAPSHOT201212030 rpm管理器会将其作为字符串进行比较,还是在其背后有更多的逻辑? 或者另一个例子:它会认识到0.10.1比0.1.1更新吗?(字符串比较在这里没有帮助)。唯一的硬性规定是发布字段中不能有破折号 考虑: rpm -qi hwdata 接 $ rpm -q hwdata --queryformat '%10{N

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

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

唯一的硬性规定是发布字段中不能有破折号

考虑:

rpm -qi hwdata

$ rpm -q hwdata --queryformat '%10{NAME} %20{VERSION} %20{RELEASE} %20{ARCH}\n'
hwdata             0.213.22                1.el5               noarch
有关释放标签规则的参考,请参见本文档的章节

注意:为了便于参考,如果SPEC文件中没有rpm描述,有时我会在rpm描述中添加一些东西。您的里程数可能会有所不同,我不建议将此用于注定要返回社区的包裹,因为这很尴尬。只是指出这是一个解决办法,以防止刹车的各种工具,运行在rpm的


注2:在“发布”字段中使用修订控制编号是一种常见做法。虽然这有点脱离了rpm惯例。(修改该字段,意味着specfile已更改…而不是内容)它是一个方便使用的字段,因为它不会破坏任何rpm工具,并为您提供对内容版本的直接引用。也。。。如果您已将rpm内容签入修订控制系统,那么无论如何,这已经超出了rpm模型的范围。即,源rpm变得不必要

这是一篇老文章,但我一直在努力把这篇文章写下来,并想与大家分享一下我的想法。 我使用的是一个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
ruby-r./string_ext.rb-e'put%Q{package-0.1-SNAPSHOT201212031}.explode.inspect'
#=>[“包”,0,1,“快照201212031”]
ruby-r./string_ext.rb-e'put%Q{package-0.2-SNAPSHOT201212031}.explode.inspect'
#=>[“包”,0,2,“快照201212031”]
#结果阵列的比较非常直接
ruby-r./string_ext.rb-e'put%Q{package-0.1-SNAPSHOT201212031}.分解%Q{package-0.2-SNAPSHOT201212030}.分解'
#=> -1
其中-1表示第一项小于第二项,0表示它们相等,1表示第二项小于第一项

1 <=> 2 #=> -1
2 <=> 2 #=> 0
3 <=> 2 #=> 1
12#=>-1
2  2 #=> 0
3  2 #=> 1
使用这种方法,从类似项的数组(比如与同一个包关联的RPM数组)中收集最大值非常简单