在Debian / Ubuntu上编写虚拟软件包提供程序的脚本

首先,获取提供特定虚拟包的(真实)包列表最简单的方法是什么? “aptitude show”似乎将其包含在虚拟包的输出中,但“apt-cache show”不包含。 然而,并不总是能够安装,而且由于本地化的缘故,脚本中的“由……提供”将是脆弱的。

# aptitude show java-sdk No current or candidate version found for java-sdk Package: java-sdk State: not a real package Provided by: default-jdk, gcj-4.4-jdk, gcj-4.5-jdk, gcj-jdk, openjdk-6-jdk, sun-java6-jdk # apt-cache show java-sdk N: Can't select versions from package 'java-sdk' as it is purely virtual N: No packages found 

其次,有没有什么合理的方法可以对提供商进行排名,使我有可能select最新的或“最优先的”? 在'java-sdk'的情况下,脚本显然应该使用'default-jdk'来开始; 然而,如果有人没有想到创build,我可以想象sorting的优先级,组件/部分和版本的组合。 (很明显,这主要对于提供标准API的虚拟包是有用的;自动为'邮件阅读器'select一个提供者将是愚蠢的。)

具体来说,我试图使用Chef自动安装Cloudera Hadoop。 “hadoop”是一个虚拟包,其中相应的真实包是“hadoop-0.20”:

 # aptitude show hadoop No current or candidate version found for hadoop Package: hadoop State: not a real package Provided by: hadoop-0.20 

当有多个提供者(例如hadoop-0.22)时,如果存在“hadoop-X.YY”,我基本上要自动select最新版本。 (或者更好的办法是,以某种方式获得每个版本的版本,而不是试图parsing这些名称。)我知道我可以通过一些脚本来实现这个目标,但是如果已经存在一个更优雅的方法,我不会感到惊讶。

更新 :“apt-cache showpkg”包含“反向提供”,其中似乎还包括完整版本信息。 这有帮助,但任何想法如何获得只有这一节?

 # apt-cache showpkg hadoop Package: hadoop Versions: Reverse Depends: sqoop,hadoop hadoop-pig,hadoop hadoop-hive,hadoop Dependencies: Provides: Reverse Provides: hadoop-0.20 0.20.2+923.21-1~maverick-cdh3 

如果你安装了grep-dctrl包,你可以使用grep-available:

 grep-available -F Provides -s Package <virtual-package-name> 

我的debian sources.list中没有可用的hadoop包,所以我将使用邮件传输代理作为示例:

 $ grep-available -F Provides -s Package mail-transport-agent Package: xmail Package: exim4-daemon-light Package: exim4-daemon-heavy Package: esmtp-run Package: postfix [...most deleted...] 

如果你也想要版本号:

 $ grep-available -F Provides -s Package,Version mail-transport-agent Package: xmail Version: 1.27-1.1+b1 Package: exim4-daemon-light Version: 4.76-2 Package: exim4-daemon-heavy Version: 4.76-2 Package: esmtp-run Version: 1.2-6 [...] 

在第二个例子中,请注意每个软件包的方便,易于parsing的段落模式。

还有很多其他选项,包括省略字段名称(“Package:”,“Version:”等)。 有关更多详细信息,请参阅手册页或–help。

你的“最喜欢的”包是由alternatives处理。 命令update-alternatives可以为您提供有关替代软件包及其优先级的信息。

update-alternatives --query editor将以机器可分析的格式显示所有编辑器条目及其优先级。

还有一个称为whiff的实用程序,它接受input并返回第一个可用条目。