DEB: поле "Обеспечивает: " игнорируется

Мне нужно заменить пакет на другой, который получает собственное имя (foo-origpackage). Чтобы использовать его в качестве замены, я добавил Provides: origpackage строка в контрольный файл. apt-cache show foo-origpackage перечисляет "Обеспечивает" запись просто отлично. Тем не менее, когда я хочу установить файл в зависимости от origpackage, он завершается ошибкой ("Пакет origpackage не установлен").

Есть ли какое-то различие между "реальными" и виртуальными пакетами, которые мне не хватает?

РЕДАКТИРОВАТЬ:

Если быть точным, то, что я хочу заменить, это xen-utils-common для Squeeze. Мой tao-xen-utils-common имеет следующее control файл:

 Источник: дао-ксен-утиль-общий
Раздел: ядро
Приоритет: необязательно
Сопровождающий: Creshal 
Build-Зависит: 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", если пакет предоставляет те же файлы.

См. Политику Debian, глава 7.

В конечном итоге проблему удалось решить, переименовав ее обратно в xen-utils-common с пользовательской версией и сделав пакет, требующий настройки, конфликтующим с более высокими версиями. Таким образом, обновления xen-utils-common блокируются до тех пор, пока я не обновлю оба пакета.

Вроде работает, но я открыт для лучших решений.

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