Мне нужно заменить пакет на собственный, который получит собственное имя (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 блокируются, пока я не обновлю оба пакета.
Вроде работает, но я открыт для лучших решений.