Всякий раз когда вы выбираете установку или обновление пакета в 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, так как она не является версией-кандидатом.
Интерактивный решатель зависимостей может разрешить подобные ситуации и даже больше. Когда остаются сломанные зависимости, или когда непосредственное разрешение зависимостей отключено, интерактивный решатель автоматически запустит поиск решения. Следующий раздел описывает то, как использовать интерактивный решатель зависимостей.