Во время периодического аудита установленных пакетов я обнаружил ошибку. Для этого аудита приложение генерирует график установленных пакетов, используя dpkg-query
. Во время этого процесса он проверяет, все ли зависимости действительно удовлетворены, так как в противном случае это может означать, что что-то не так в системе или что-то не так с приложением, генерирующим график. Это случилось сегодня, когда приложение остановилось из-за ошибки, сообщив, что обнаружил пакет с неудовлетворенной зависимостью от python:any
. Тем не менее, в зависимости от пакета в порядке. Я проверил python:any
- это виртуальный пакет, предоставляемый пакетом python
. Synaptic говорит, что python
предоставляет python:any
, но мое приложение не получает эту информацию от dpkg-query
.
Вот тест, который вы можете выполнить из командной строки, который показывает проблему (при условии Ubuntu 14.04):
$ dpkg-query --showformat='${Package}\n${Provides}\n' --show python3
> python3
> python3-profiler
# Note `python3:any` does not appear
О том же пакете, Synaptic говорит, что он предоставляет python3:any
и python3-profiler
, Первый отсутствует в информации, возвращенной dpkg-query
.
При отображении в качестве зависимости все нормально:
$ dpkg-query --showformat='${Package}\n${Depends}\n' --show apturl-common
# Note the second item in the format is now `Depends`
> apturl-common
> python3:any (>= 3.3.2-2~), python3-apt, python3-update-manager
Это ошибка в dpkg-query
? Или это я ошибочно ожидаю, что он расскажет обо всех виртуальных пакетах, в то время как я могу предположить, что я могу выводить этот тип виртуальных пакетов «сам»? Это какие-то правила, которые я не знаю о том, что возвращается в ${Provides}
?
python3:any (>= 3.3.2-2~)
не виртуальный пакет, это - строка замены, созданная ${python3:Depends}
шаблон и заполненный dh_python3
при вызове от dh_gencontrol
, когда пакет был создан. Смотрите на debian/control
файл apturl
исходный пакет:
Package: apturl-common
Architecture: any
Depends: ${python3:Depends},
${shlibs:Depends},
${misc:Depends},
python3-apt,
python3-update-manager
Replaces: apturl (<< 0.3.6ubuntu2)
Description: install packages using the apt protocol - common data
AptUrl is a simple graphical application that takes an URL (which follows the
apt-protocol) as a command line option, parses it and carries out the
operations that the URL describes (that is, it asks the user if he wants the
indicated packages to be installed and if the answer is positive does so for
him).
Теперь, почему python3:any
? Давайте заключим debian политику в кавычки:
Определение только любой указывает, что исходный пакет не зависит ни от какой конкретной архитектуры и должен скомпилировать прекрасный на любом. Произведенный двоичный пакет (пакеты) будет характерен для того, что текущая архитектура сборки.
И это точно имеет место для python3
двоичный пакет:
Package: python3
Architecture: any
Multi-Arch: allowed
Pre-Depends: python3-minimal (= ${binary:Version})
Depends: python3.4 (>= 3.4.3-1), libpython3-stdlib (= ${binary:Version}), ${misc:Depends}, dh-python
Suggests: python3-doc (>= ${binary:Version}), python3-tk (>= 3.4.3-1) , python3-venv (>= ${binary:Version})
Replaces: python3-minimal (<< 3.1.2-2)
Provides: python3-profiler
Description: interactive high-level object-oriented language (default python3 version)
Python, the high-level, interactive object oriented language,
includes an extensive class library with lots of goodies for
network programming, system administration, sounds and graphics.
.
This package is a dependency package, which depends on Debian's default
Python 3 version (currently v3.4).
Источники:
Я чувствую для предположения anwser, все еще не стесняйтесь добавлять собственный anwser.
я узнал, что существует /var/lib/dpkg/available
база данных, как raw‑text. Я проверил на python3
(для продолжения того же примера как в вопросе), он говорит Provides: python3-profiler
: нет никакого python3:any
.
Так может быть anwser: существует не всегда прямое соответствие между, требования, возвращенные dpkg-query
и пакет, обеспеченный, как возвращено dpkg-query
также, и вероятно Синаптический, выводят “fake” виртуальный пакет, и python3:any
не действительно виртуальный пакет (я сказал бы Синаптический, вводит в заблуждение здесь).
По всей вероятности нет ничего с de, обеспеченным пакеты, и это - я, кто ошибочно читает :xyz
в конце пакета зависимости как часть имени packag, в то время как это не.