Назад | Перейти на главную страницу

DEB: поле «Provides:» игнорируется

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

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

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

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

Source: tao-xen-utils-common
Section: kernel
Priority: optional
Maintainer: Creshal <administration@tao.at>
Build-Depends: debhelper
Standards-Version: 3.8.0
Homepage: http://tao.at

Package: tao-xen-utils-common
Architecture: all
Depends: gawk, lsb-base, udev, xenstore-utils, tao-firewall
Provides: xen-utils-common
Conflicts: xen-utils-common
Replaces: xen-utils-common
Description: Xen administrative tools - common files (modified)
 The userspace tools to manage a system virtualized through the Xen virtual
 machine monitor.
 Modified for use with TAO Firewall.

Однако установка xen-utils-4.0 не удалась:

foo@bar# apt-cache showpkg tao-xen-utils-common
Package: tao-xen-utils-common
Versions: 
4.0.0-1tao1 (/var/lib/apt/lists/repo.tao.at_dists_stable_main_binary-amd64_Packages) (/var/lib/dpkg/status)
 Description Language: 
                 File: /var/lib/apt/lists/repo.tao.at_dists_stable_main_binary-amd64_Packages
                  MD5: 7c2503f563fca13b33b4eb3cbcb3c129


Reverse Depends: 
  tao-firewall,tao-xen-utils-common
  tao-firewall,tao-xen-utils-common
Dependencies: 
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)) 
Provides: 
4.0.0-1tao1 - xen-utils-common 
Reverse Provides: 


foo@bar# apt-get install xen-utils-4.0
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  xen-utils-common
Suggested packages:
  xen-docs-4.0
The following packages will be REMOVED:
  tao-xen-utils-common
The following NEW packages will be installed:
  xen-utils-4.0 xen-utils-common

Редактировать:

foo@bar# apt-cache policy xen-utils-4.0
xen-utils-4.0:
  Installed: (none)
  Candidate: 4.0.1-4
  Version table:
     4.0.1-4 0
        500 http://ftp.at.debian.org/debian/ stable/main amd64 Packages
     4.0.1-4 0
        500 http://security.debian.org/ stable/updates/main amd64 Packages

Я потратил некоторое время на изучение этой же проблемы и пришел к выводу, что «Provides» игнорируется, потому что xen-utils-4.0 имеет версию «Depends» для xen-utils-common.

Цитируя Руководство по политике Debian:

Поле Provides может не содержать номеров версий, и номер версии конкретного пакета, который предоставляет конкретный виртуальный пакет, не будет учитываться при рассмотрении зависимости или конфликта с именем виртуального пакета.

Если бы Depends были неверсированными, обеспечивающие были бы удовлетворены, однако Provides, который всегда не версионирован, никогда не сможет удовлетворить версионные Depends.

К сожалению, у меня нет другого решения, кроме того, что вы уже предложили: сохранить то же имя пакета и иметь более высокий номер версии.

Раздел Руководства по политике Debian, цитируемый в @ Ответ Каведона по-прежнему без изменений, но устарел. Поскольку dpkg 1.17.11 возможна установка версии для предоставленного пакета. Из журнал изменений:

  • Добавить версионный Обеспечивает поддержку:
    • Добавьте новую команду dpkg --assert-versioned-provides.
    • Пакеты могут предоставлять определенную версию, «виртуальную (= 1.0)», которая будет учитываться, раньше она просто принималась при синтаксическом анализе.
    • Виртуальные пакеты без версий не будут удовлетворять версионным зависимостям.
    • Виртуальные пакеты с версией будут удовлетворять не версионным зависимостям. Основан на скелетном коде Бена Коллинза. Закрывается: 7330, 24934, 112131, 134582, 180316.

Итак, чтобы решить исходный пример, в контрольном файле вы добавляете строку

Version: *version*

(заменив * версию * актуальной версией) и замените строку

Provides: xen-utils-common

с участием

Provides: xen-utils-common (= ${binary:Version})

«Предоставляет» только для виртуальных пакетов. Если вы хотите заменить реальный пакет, вам нужно использовать «Заменяет» и, возможно, также «Конфликты», если пакет предоставляет те же файлы.

Видеть Политика Debian, глава 7.

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

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