Установка сценариев поставщика виртуальных пакетов в 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; автоматически выбирать поставщика для "mail-reader" было бы глупо.)
Чтобы быть конкретным, я пытаюсь автоматизировать установку Cloudera Hadoop с помощью Chef. '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" включает в себя "Reverse Provides", которое, по-видимому, дополнительно содержит полную информацию о версии. Это помогает, но есть идеи, как получить только этот раздел?
# 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
2 ответа
Если вы устанавливаете пакет grep-dctrl, вы можете использовать grep-available:
grep-available -F Provides -s Package <virtual-package-name>
У меня нет пакетов hadoop, доступных в моем debian sources.list, поэтому я буду использовать 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:" и т. Д.). Смотрите man-страницу или --help для более подробной информации.
Ваша "самая предпочтительная" посылка обрабатывается alternatives
, Команда update-alternatives
может дать вам информацию об альтернативных пакетах и их приоритете.
update-alternatives --query editor
отобразит все записи редактора и их приоритет в машинно-разборчивом формате.
Существует также утилита под названием whiff
который принимает ввод и возвращает первую пригодную для использования запись.