web-dev-qa-db-fra.com

`dpkg-query` et packages virtuels: comment lire ou interpréter` $ {Provides} `?

Contexte

Lors de mon audit périodique des packages installés, j'ai rencontré une erreur. Pour cet audit, une application génère un graphique des packages installés, à l'aide de dpkg-query. Au cours de ce processus, il vérifie dans le temps, toutes les dépendances sont en effet satisfaites, car cela signifierait sinon que quelque chose ne va pas dans le système ou quelque chose ne va pas avec l'application générant le graphique. Il est arrivé aujourd'hui que l'application s'est arrêtée sur une erreur, indiquant qu'elle a trouvé un package avec une dépendance non satisfaite à python:any. Cependant, le package dépendant est très bien. J'ai vérifié python:any est un package virtuel fourni par le package python. Synaptic dit que python fournit python:any, mais ma candidature ne reçoit pas ces informations de dpkg-query.

Voici un test que vous pouvez exécuter à partir de la ligne de commande, qui montre le problème (en supposant Ubuntu 14.04):

$ dpkg-query --showformat='${Package}\n${Provides}\n' --show python3
> python3
> python3-profiler
# Note `python3:any` does not appear

À propos du même package, Synaptic indique qu'il fournit python3:any et python3-profiler. Le premier est absent des informations retournées par dpkg-query.

Quand on apparaît comme une dépendance, ça va:

$ 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

Question

Est-ce un bug dans dpkg-query? Ou est-ce que je m'attends à tort à ce qu'il parle de tous les packages virtuels alors que je peux être supposé déduire ce type de packages virtuels "moi-même"? Y a-t-il des règles que je ne connais pas sur ce qui est retourné dans ${Provides}?

1
Hibou57

python3:any (>= 3.3.2-2~) n'est pas un package virtuel, c'est une chaîne de substitution créée par le ${python3:Depends} motif et rempli par dh_python3 lorsque appelé depuis dh_gencontrol lors de la construction du package. Jetez un oeil à la debian/control fichier du paquet source 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).

Maintenant pourquoi python3:any? Citons la politique debian:

La spécification de any indique que le package source ne dépend d'aucune architecture particulière et devrait compiler correctement sur n'importe laquelle. Le ou les packages binaires produits seront spécifiques à l'architecture actuelle de la construction.

Et c'est exactement le cas pour le python3 paquet binaire:

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).

Sources:

2
Sylvain Pineau

J'ai l'impression de deviner une réponse, n'hésitez pas à ajouter votre propre réponse.

J'ai appris qu'il y a un /var/lib/dpkg/available base de données, en tant que texte brut. J'ai vérifié python3 (pour continuer avec le même exemple que dans la question) il est dit Provides: python3-profiler: il n'y a pas python3:any.

Il se peut donc que la réponse soit: il n'y a pas toujours de correspondance directe entre les exigences renvoyées par dpkg-query et un package fourni retourné par dpkg-query aussi, et probablement Synaptic déduit un "faux" paquet virtuel, et python3:any n'est pas vraiment un paquet virtuel (je dirais que Synaptic est trompeur ici).

Il n'y a probablement rien avec les paquets fournis, et c'est moi qui lit par erreur :xyz à la fin d'un paquet, les dépendances faisant partie du nom du paquet, alors que ce n'est pas le cas.

0
Hibou57