Par exemple, awk
est un paquet virtuel fourni par original-awk
, mawk
et gawk
.
Essayer de l'installer directement donne :
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package awk is a virtual package provided by:
original-awk:i386 2012-12-20-4
mawk:i386 1.3.3-17ubuntu2
gawk:i386 1:4.1.1+dfsg-1
original-awk 2012-12-20-4
mawk 1.3.3-17ubuntu2
gawk 1:4.1.1+dfsg-1
You should explicitly select one to install.
E: Package 'awk' has no installation candidate
Cependant, de nombreux packages virtuels sont nécessaires en tant que dépendances par les packages installés par défaut, par exemple awk
lui-même est requis par base-files
, qui vérifie les journaux APT est installé avec un tas d'autres packages via apt-get --yes
; d'une manière ou d'une autre, APT finit par choisir automatiquement l'un des trois (je suis presque sûr que c'est mawk
, mais ce n'est pas le but de la question).
Comment APT choisit-il le package spécifique à installer dans ce cas ?
Réponse acceptée :
Comment APT choisit-il le package spécifique à installer dans ce cas ?
APT ne sélectionne pas de package. Il dit :
Vous devez en sélectionner un explicitement à installer.
Si vous essayez de sélectionner manuellement un package, il ne sera pas installé.
Dans le cas de fichiers de base dépendant de awk, cela n'a pas d'importance. Tout d'abord, il dépend en fait de awk, forçant dpkg à installer awk avant de commencer à installer les fichiers de base; deuxièmement, mawk a la priorité requise qui est installée lors de l'installation du système, et apt vous harcèle si vous essayez de le supprimer. Alors, ne le faites pas.
Maintenant, selon les sources, apt essaie d'abord de satisfaire la dépendance avant d'essayer avec des packages virtuels (c'est-à-dire si les dépendances sont firefox | www-browser
, vérifie si l'un des packages est installé, puis essayez d'installer firefox si ni l'un ni l'autre ne l'est). Si le package non virtuel n'est pas disponible, il semble simplement itérer sur tous les packages qui fournissent le package virtuel, si aucune autre dépendance n'est rompue. D'autres commentaires témoignent de ce comportement, ce qui conduit à la fonction GrpIterator ::FindPreferredPkg.