Всякий раз когда вы выбираете установку или обновление пакета в aptitude, aptitude сразу же предпринимает попытку разрешения всех неудовлетворённых зависимостей. Для каждой неудовлетворённой зависимости («Зависит», «Рекомендует», или «Конфликтует»), он выполняет следующие шаги:
Если зависимость является рекомендацией, aptitude пытается определить, является она «новой» рекомендацией, или «ранее удовлетворённой» рекомендацией. aptitude рассматривает рекомендацию в качестве «новой», если пакет, объявляющий эту рекомендацию, в настоящее время не установлен, или если установленная версия данного пакета не рекомендует пакет с тем же именем. С другой стороны, рекомендация является «ранее удовлетворённой», если пакет, объявляющий эту рекомендацию, установлен, установленная в настоящее время версия этого пакета рекомендует пакет с тем же именем, и эта рекомендация в настоящее время удовлетворена.
Например: допустим, что версия 1.0
пакета
prog
рекомендует версию 4.0
пакета
libcool1
, но версия 2.0
пакета
prog
рекомендует версию 5.0
пакета
libcool1
, а также рекомендует пакет
apache
. Если вы выберите обновление пакета
prog
с версии 1.0
до версии
2.0
, рекомендация пакета apache
будет
рассматриваться в качестве «новой», поскольку версия
1.0
пакета prog
не рекомендовала пакет
apache
. С другой стороны, рекомендация пакета
libcool1
не является
«новой», так как версия 1.0
пакета
prog
рекомендовала пакет libcool1
,
даже несмотря на то, что она рекомендовала другую версию. Тем не менее, если
пакет libcool1
установлен, эта рекомендация будет
рассматриваться в качестве «ранее удовлетворённой».
Если параметр настройки APT::Install-Recommends
имеет значение true
, то aptitude всегда будет пытаться
удовлетворить «новые» и «ранее удовлетворённые»
рекомендации; все остальные будут игнорироваться непосредственным
решением. Если этот параметр имеет значение false
,
все рекомендации будут игнорироваться алгоритмом
непосредственного разрешения зависимостей.
Если зависимость от нескольких пакетов составлена с применением ИЛИ,
рассматривается каждая альтернатива в том порядке, в каком они
даны. Например, если пакет зависит от «exim |
mail-transport-agent
», aptitude в первую очередь
рассмотрит пакет exim
, а затем
mail-transport-agent
.
Попытаться разрешить зависимость для каждой альтернативы. Если зависимость является конфликтом, удалить текущую альтернативу, если она установлена (и для конфликта без версии, также удалить всякий пакет, предоставляющий цель конфликта). В противном случае, установить версию-кандидат текущей альтернативы, если она разрешает зависимость. Если же нет, или если нет версии-кандидата (например потому, что текущая альтернатива является виртуальным пакетом), и если зависимость указана без версии, то попытаться установить пакет с наивысшим приоритетом[12], чья версия-кандидат предоставляет цель текущей альтернативы.
Например, мы пытаемся разрешить зависимость «Зависит: exim |
mail-transport-agent
». aptitude в первую очередь
попытается установить пакет exim
. Если пакет
exim
не доступен, aptitude попытается установить пакет
с наивысшим приоритетом, чья версия-кандидат предоставляет
exim
. Если такого пакета нет, aptitude установит пакет
с наивысшим приоритетом, чья версия-кандидат предоставляет виртуальный пакет
mail-transport-agent
. С другой стороны, допустим, что эта
зависимость имеет вид «Зависит: exim (>= 2.0.0) |
mail-transport-agent
», но доступна лишь версия
1.0
пакета exim
. В этом случае,
aptitude не будет устанавливать exim
(поскольку его
версия не подходит), и не будет пытаться установить пакеты, предоставляющие
exim
(так как виртуальные пакеты не могут подойти для
разрешения зависимости с ограничением версии). Таким образом, aptitude
прибегнет к установке пакета с наивысшим приоритетом, чья версия-кандидат
предоставляет mail-transport-agent
.
Если пакет был установлен на предыдущем шаге, разрешить его зависимости, используя этот алгоритм, затем остановиться.
Хотя этот метод обычно разрешает все зависимости пакетов, он может не работать в ряде обстоятельств.
Конфликты разрешаются удалением пакета, который является целью конфликта. Тем не менее, в этом случае другие пакеты, которые зависят от этого пакета, имеют нерешённые зависимости; непосредственный решатель не предпринимает попыток исправить их.
Зависимость может быть неразрешимой из-за ограничений версии и из-за того
ограничения, что рассматриваются только версии-кандидаты. Например,
допустим, что доступны версии 1.0
и
2.0
пакета fileutils
, что
версией-кандидатом является 1.0
, и что пакет
octopus
объявляет зависимость «Зависит:
fileutils (>= 2.0)
». Непосредственное решение не может
разрешить эту зависимость: оно никогда не будет рассматривать версию
2.0
, так как она не является версией-кандидатом.
Интерактивный решатель зависимостей может разрешить подобные ситуации и даже больше. Когда остаются сломанные зависимости, или когда непосредственное разрешение зависимостей отключено, интерактивный решатель автоматически запустит поиск решения. Следующий раздел описывает то, как использовать интерактивный решатель зависимостей.