Por ejemplo, awk
es un paquete virtual proporcionado por original-awk
, mawk
y gawk
.
Intentar instalarlo directamente 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
Sin embargo, se necesitan muchos paquetes virtuales como dependencias de los paquetes instalados de forma predeterminada, por ejemplo, awk
en sí mismo es necesario para base-files
, que verifica los registros de APT se instala junto con un montón de otros paquetes a través de apt-get --yes
; de alguna manera, APT termina eligiendo uno de los tres automáticamente (estoy bastante seguro de que es mawk
, pero ese no es el punto de la pregunta).
¿Cómo elige APT el paquete específico para instalar en este caso?
Respuesta aceptada:
¿Cómo elige APT el paquete específico para instalar en este caso?
APT no selecciona un paquete. Dice:
Debe seleccionar explícitamente uno para instalar.
Si intenta seleccionar manualmente un paquete, no se instalará.
En el caso de archivos base que dependen de awk, es irrelevante. Primero, en realidad depende de awk, lo que obliga a dpkg a instalar awk antes de comenzar a instalar los archivos base; en segundo lugar, mawk tiene prioridad requerida que se instalan en la instalación del sistema, y apt lo molesta si intenta eliminarlo. Entonces, simplemente no lo hagas.
Ahora, según las fuentes, apt primero intenta satisfacer la dependencia antes de intentar con paquetes virtuales (es decir, si las dependencias son firefox | www-browser
, verifica si alguno de los paquetes está instalado, luego intente instalar Firefox si ninguno lo está). Si el paquete no virtual no está disponible, parece iterar sobre todos los paquetes que proporcionan el paquete virtual, si no se rompen otras dependencias. Otros comentarios que evidencian este comportamiento son los que conducen a la función GrpIterator::FindPreferredPkg.