Ubuntu

在 Debian/Ubuntu 上腳本安裝虛擬包提供程序

  • September 14, 2011

首先,獲取提供特定虛擬包的(真實)包列表的最簡單方法是什麼?‘aptitude show’ 似乎將它包含在虛擬包的輸出中,但 ‘apt-cache show’ 沒有。但是,並不總是安裝 aptitude,並且由於本地化,在腳本中對“提供者:”進行 grep’ing 會很脆弱。

# 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

其次,是否有任何合理的方式來對提供商進行排名,以便我可能選擇最新的或“最喜歡”的?在“java-sdk”的情況下,腳本顯然應該使用“default-jdk”開頭;但是,如果有人沒有想過要創建它,我可以想像按優先級、組件/部分和版本的組合進行排序。(顯然,這主要對提供標準 API 的虛擬包有用;自動為“郵件閱讀器”選擇提供者會很愚蠢。)

具體來說,我正在嘗試使用 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”,我基本上想自動選擇最新版本。(或者更好的是,以某種方式從 apt 獲取每個版本的版本,而不是嘗試解析名稱。)我知道我可以通過一些腳本來實現這一點,但如果已經存在更優雅的方式,我不會感到驚訝。

更新:“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 包,所以我將使用 mail-transport-agent 作為範例:

$ 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
[...]

請注意第二個範例中每個包的方便、易於解析的段落模式。

還有許多其他選項,包括省略欄位名稱(“Package:”、“Version:”等)。有關更多詳細資訊,請參見手冊頁或 –help。

引用自:https://serverfault.com/questions/285033