Во-первых, как проще всего получить список (реальных) пакетов, которые предоставляют конкретный виртуальный пакет? Кажется, что «aptitude show» включает его в вывод для виртуального пакета, а «apt-cache show» - нет. Однако aptitude устанавливается не всегда, и использование grep'а для «Provided by:» в сценарии может быть неустойчивым из-за локализации.
# 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; автоматический выбор поставщика для «почтового читателя» был бы глупым.)
Чтобы быть конкретным, я пытаюсь автоматизировать установку 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' включает «Обратные поставщики», которые, кажется, также включают полную информацию о версии. Это помогает, но есть идеи, как получить только этот раздел?
# 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>
У меня нет пакетов 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
[...]
Обратите внимание на удобный, легко анализируемый режим абзаца для каждого пакета во втором примере.
Есть множество других опций, включая опускание имен полей («Пакет:», «Версия:» и т. Д.). См. Страницу руководства или --help для получения более подробной информации.
Ваш "самый предпочтительный" пакет обрабатывается alternatives
. Команда update-alternatives
может предоставить вам информацию об альтернативных пакетах и их приоритетах.
update-alternatives --query editor
отобразит все записи редактора и их приоритет в машиночитаемом формате.
Также есть утилита под названием whiff
который принимает ввод и возвращает первую пригодную для использования запись.