Ogni volta che si sceglie di installare o aggiornare un pacchetto in aptitude, aptitude fa un tentativo immediato di risolvere tutte le sue dipendenze che non sono soddisfatte. Per ciascuna dipendenza non soddisfatta (che sia una relazione «Dipende», «Raccomanda», oppure «Va in conflitto»), effettua i seguenti passaggi:
Se la dipendenza è una raccomandazione, aptitude cerca di capire se è una «nuova» raccomandazione o una raccomandazione «precedentemente soddisfatta». aptitude considera una raccomandazione come «nuova» se il pacchetto che la dichiara non è attualmente installato oppure se la sua versione installata non raccomanda un pacchetto con lo stesso nome. Al contrario, una raccomandazione è «precedentemente soddisfatta» se il pacchetto che la dichiara è installato, la versione attualmente installata raccomanda un pacchetto con lo stesso nome e tale raccomandazione è soddisfatta.
Per esempio, si supponga che la versione 1.0
di
prog
raccomandi la versione 4.0
di
bellalib1
, ma che la versione 2.0
di
prog
raccomandi la versione 5.0
di
bellalib1
e raccomandi inoltre
apache
. Se si scegliesse di aggiornare
prog
dalla versione 1.0
alla versione
2.0
, la raccomandazione di apache
verrebbe considerata «nuova» perché la versione
1.0
di prog
non raccomandava
apache
. Al contrario, la raccomandazione di
bellalib1
non sarebbe
«nuova», perché la versione 1.0
di
prog
raccomandava bellalib1
, anche se
raccomandava una versione diversa. In ogni caso, se
bellalib1
fosse già installata, allora tale
raccomandazione verrebbe considerata «precedentemente
soddisfatta».
Se l'opzione di configurazione APT::Install-Recommends
è impostata a true
, aptitude cerca sempre di soddisfare
le raccomandazioni «nuove» e «precedentemente
soddisfatte»; tutte le altre vengono ignorate dalla risoluzione
immediata. Se quella opzione è impostata a false
, la
risoluzione immediata delle dipendenze ignora tutte le
raccomandazioni.
Se la dipendenza è verso diversi pacchetti combinati con OR, esamina tutte
le alternative nell'ordine in cui sono fornite. Per esempio, se un pacchetto
dipende da «exim | mail-transport-agent
»,
aptitude prima esamina exim
, poi
mail-transport-agent
.
Per ciascuna alternativa, cerca di risolverla. Se la dipendenza è un conflitto, rimuove l'alternativa attuale se è installata (e per un conflitto non relativo ad una specifica versione, rimuove anche qualsiasi pacchetto che fornisce l'oggetto del conflitto). Altrimenti installa la versione candidata dell'alternativa attuale, se soddisfa la dipendenza. Se ciò non è vero, o se non è presente una versione candidata (ad esempio, perché l'alternativa attuale è un pacchetto virtuale), e se la dipendenza non è relativa ad una specifica versione, cerca di installare il pacchetto con più alta priorità[12] la cui versione candidata fornisca l'oggetto dell'alternativa attuale.
Per esempio, si supponga di voler risolvere la dipendenza
«Dipende: exim |
mail-transport-agent
». aptitude cercherebbe come prima
cosa di installare il pacchetto exim
. Se
exim
non fosse disponibile, aptitude cercherebbe quindi
di installare il pacchetto con più alta priorità la cui versione candidata
fornisca exim
. Se non esistesse un tale pacchetto,
aptitude installerebbe il pacchetto con più alta priorità la cui versione
candidata fornisca il pacchetto virtuale
mail-transport-agent
. D'altro canto, supponendo che la
dipendenza sia «Dipende: exim (>= 2.0.0) |
mail-transport-agent
», ma che sia disponibile solo la
versione 1.0
di exim
, aptitude in
questo caso non installerebbe exim
(perché la versione
non corrisponde), né cercherebbe di installare pacchetti che forniscono
exim
(perché i pacchettti virtuali non possono soddisfare
la corrispondenza con una restrizione sulla versione). aptitude perciò
ripiegherebbe sull'installazione del pacchetto con più alta priorità la cui
versione candidata fornisca mail-transport-agent
.
Se il passo precedente ha installato un pacchetto, risolve le sue dipendenze usando questo algoritmo e poi si ferma.
Benché questa tecnica risolva molto spesso tutte le dipendenze che sussistono tra i pacchetti, può fallire in alcune circostanze comuni.
I conflitti vengono risolti rimuovendo il pacchetto che è l'oggetto del conflitto. Ma altri pacchetti che dipendono da esso hanno così dipendenze non soddisfatte; la risoluzione immediata non cerca di affrontare il problema.
Può non essere possibile soddisfare una dipendenza a causa di restrizioni
sulla versione e per la limitazione che solo le versioni candidate vengono
prese in considerazione. Come esempio, si supponga che siano disponibili le
versioni 1.0
e 2.0
di
fileutils
, che la versione candidata sia
1.0
e il pacchetto octopus
dichiari la
dipendenza «Dipende: fileutils (>= 2.0)
». La
risoluzione immediata non sarebbe in grado di risolvere questa dipendenza:
non prenderebbe mai in considerazione la versione 2.0
del
pacchetto, dato che non è la versione candidata.
Il risolutore interattivo di dipendenze può risolvere queste situazioni e altre ancora. Quando ci sono dipendenze non soddisfatte restanti, o quando la risoluzione immediata delle dipendenze è disabilitata, il risolutore interattivo comincia automaticamente a cercare una soluzione. La prossima sezione descrive come usare il risolutore interattivo di dipendenze.
[12] Il pacchetto con la più alta priorità di dpkg, non quello
con la più alta priorità di pin di apt
.