Установка сценариев поставщика виртуальных пакетов в 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 который принимает ввод и возвращает первую пригодную для использования запись.

Другие вопросы по тегам