在 Debian/Ubuntu 上腳本安裝虛擬包提供程序
首先,獲取提供特定虛擬包的(真實)包列表的最簡單方法是什麼?‘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。