DEB: поле "Обеспечивает: " игнорируется
Мне нужно заменить пакет на другой, который получает собственное имя (foo-origpackage). Чтобы использовать его в качестве замены, я добавил Provides: origpackage
строка в контрольный файл. apt-cache show foo-origpackage
перечисляет "Обеспечивает" запись просто отлично. Тем не менее, когда я хочу установить файл в зависимости от origpackage, он завершается ошибкой ("Пакет origpackage не установлен").
Есть ли какое-то различие между "реальными" и виртуальными пакетами, которые мне не хватает?
РЕДАКТИРОВАТЬ:
Если быть точным, то, что я хочу заменить, это xen-utils-common для Squeeze. Мой tao-xen-utils-common имеет следующее control
файл:
Источник: дао-ксен-утиль-общий Раздел: ядро Приоритет: необязательно Сопровождающий: CreshalBuild-Зависит: debhelper Стандарты-Версия: 3.8.0 Домашняя страница: http://tao.at Пакет: тао-ксен-утиль-общий Архитектура: все Зависит: gawk, lsb-base, udev, xenstore-utils, tao-firewall Обеспечивает: xen-utils-common Конфликты: xen-utils-common Заменяет: xen-utils-common Описание: инструменты администрирования Xen - общие файлы (измененные) Инструменты пользовательского пространства для управления системой, виртуализированной через виртуальную систему Xen. монитор машины. Модифицировано для использования с TAO Firewall.
Установка xen-utils-4.0 завершается неудачно, однако:
foo @ bar # apt-cache showpkg tao-xen-utils-common Пакет: тао-ксен-утиль-общий Версии: 4.0.0-1tao1 (/var/lib/apt/lists/repo.tao.at_dists_stable_main_binary-amd64_Packages) (/var/lib/dpkg/status) Язык описания: Файл: /var/lib/apt/lists/repo.tao.at_dists_stable_main_binary-amd64_Packages MD5: 7c2503f563fca13b33b4eb3cbcb3c129 Обратное зависит: дао-брандмауэр, дао-Xen-Utils-общий дао-брандмауэр, дао-Xen-Utils-общий зависимости: 4.0.0-1tao1 - gawk (0 (null)) lsb-base (0 (null)) udev (0 (null)) xenstore-utils (0 (null)) tao-firewall (0 (null)) xen-utils-common (0 (null)) xen-utils-common (0 (null)) Обеспечивает: 4.0.0-1tao1 - xen-utils-common Обратное обеспечивает: foo @ bar # apt-get install xen-utils-4.0 Чтение списков пакетов... Готово Построение дерева зависимостей Чтение информации о состоянии... Готово Будут установлены следующие дополнительные пакеты: Xen-Utils-общий Предлагаемые пакеты: Xen-документы-4.0 Следующие пакеты будут удалены: дао-Xen-Utils-общий Будут установлены следующие НОВЫЕ пакеты: xen-utils-4.0 xen-utils-common
Редактировать:
foo @ bar # apt-cache policy xen-utils-4.0 Xen-Utils-4.0: Установлено: (нет) Кандидат: 4.0.1-4 Таблица версий: 4.0.1-4 0 500 http://ftp.at.debian.org/debian/ stable / main amd64 пакетов 4.0.1-4 0 500 http://security.debian.org/ stable / updates / main amd64 пакетов
4 ответа
Я потратил довольно много времени на изучение этой же проблемы и пришел к выводу, что "Provides" игнорируется, поскольку в xen-utils-4.0 есть версия "Зависит" от xen-utils-common.
Цитирование руководства по политике Debian:
Поле Provides может не содержать номеров версий, а номер версии конкретного пакета, который предоставляет конкретный виртуальный пакет, не будет учитываться при рассмотрении зависимости или конфликта с именем виртуального пакета.
Если бы Зависимости были неверсированными, провайдеры были бы удовлетворены, однако провизии, которые всегда неверсированные, никогда не могли бы удовлетворить версионные Зависимости.
К сожалению, у меня нет решения, кроме того, что вы уже предложили: сохранить то же имя пакета и иметь более высокий номер версии.
Раздел Руководства по политике Debian, цитируемый в ответе @cavedon, до сих пор не изменился, но устарел. Начиная с dpkg 1.17.11 возможна установка версии для предоставленного пакета. Из журнала изменений:
- Добавить версионный Обеспечивает поддержку:
- Добавьте новую команду dpkg --assert-versioned-provide.
- Пакеты могут предоставлять конкретную версию, "виртуальную (= 1.0)", которая будет учитываться, ранее она была бы принята только при разборе.
- Не версионные виртуальные пакеты не будут соответствовать версионным зависимостям.
- Версионные виртуальные пакеты будут соответствовать не версионным зависимостям. Основано на скелетном коде Бена Коллинза. Закрытие: #7330, #24934, #112131, #134582, #180316
Таким образом, чтобы решить исходный пример, в контрольном файле вы добавляете строку
Version: *version*
(заменив * версию * актуальной версией) и заменив строку
Provides: xen-utils-common
с
Provides: xen-utils-common (= ${binary:Version})
"Обеспечивает" только для виртуальных пакетов. Если вы хотите заменить реальный пакет, вам нужно использовать "Replaces" и, возможно, также "Conflicts", если пакет предоставляет те же файлы.
В конечном итоге проблему удалось решить, переименовав ее обратно в xen-utils-common с пользовательской версией и сделав пакет, требующий настройки, конфликтующим с более высокими версиями. Таким образом, обновления xen-utils-common блокируются до тех пор, пока я не обновлю оба пакета.
Вроде работает, но я открыт для лучших решений.