Ad esempio, awk
è un pacchetto virtuale fornito da original-awk
, mawk
e gawk
.
Provare a installarlo direttamente produce:
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
Tuttavia, molti pacchetti virtuali sono necessari come dipendenze dai pacchetti installati per impostazione predefinita, ad esempio awk
stesso è necessario per base-files
, che controllando i log di APT viene installato insieme a una serie di altri pacchetti tramite apt-get --yes
; in qualche modo APT finisce per scegliere automaticamente uno dei tre (sono abbastanza sicuro che sia mawk
, ma non è questo il punto della domanda).
In che modo APT sceglie il pacchetto specifico da installare in questo caso?
Risposta accettata:
In che modo APT sceglie il pacchetto specifico da installare in questo caso?
APT non seleziona un pacchetto. Dice:
Dovresti selezionarne uno esplicitamente da installare.
Se provi a selezionare manualmente un pacchetto, questo non verrebbe installato.
Nel caso di file di base dipendenti da awk è irrilevante. Innanzitutto, in realtà dipende da awk, costringendo dpkg a installare awk prima di iniziare a installare i file di base; in secondo luogo, mawk ha la priorità richiesta che viene installata durante l'installazione del sistema e apt ti tormenta se provi a rimuoverlo. Quindi, non farlo.
Ora, secondo le fonti, apt prova prima a soddisfare la dipendenza prima di provare con i pacchetti virtuali (cioè, se dipende sono firefox | www-browser
, controlla se uno qualsiasi dei pacchetti è installato, quindi prova a installare Firefox se nessuno dei due lo è). Se il pacchetto non virtuale non è disponibile, sembra semplicemente scorrere su tutti i pacchetti che forniscono il pacchetto virtuale, se non vengono interrotte altre dipendenze. Altre prove di commenti di questo comportamento sono queste che portano alla funzione GrpIterator::FindPreferredPkg.