В руководствах по установке программного обеспечения всегда есть длинный список зависимостей. Как они находят эти зависимости?
Например, я начинаю на новом сервере Ubuntu, следуя инструкциям по установке rvm. Они предоставляют что-то вроде:
sudo apt-get install git-core libreadline5 libncurses5-dev libreadline5-dev build-essential zlib1g-dev libssl-dev libpcre3-dev libxml2-dev libxslt-dev;
Я просто хочу понять, как они находят все эти зависимости. Копирование и вставка работает, но я думаю, что важнее понять это.
Каждый пакет имеет список собственных зависимостей. Для дебс, который использует Ubuntu, вы можете: -
[andys@daedalus ~]$ apt-cache depends git-core
git-core
Depends: git
Зависимости для пакета указываются при сборке пакета. Некоторые из них указываются вручную сопровождающий пакетов (человек, ответственный за сборку пакета), а некоторые автоматически определяются при сборке пакета. Если вы загрузили пакет с исходным кодом Debian и заглянули в debian/control
файл, вы увидите несколько строк, например Depends:
, Conflicts:
, Replaces:
, и т.д.
Итак, вернемся к примеру - git-core
зависит только от одного пакета, который git
. git
вероятно, является своего рода метапакетом, который, в свою очередь, имеет целый ряд зависимостей, чтобы убедиться, что все пакеты, необходимые для запуска git, установлены, а не только для удовлетворения зависимостей одного пакета. Если мы посмотрим на git
пакет: -
[andys@daedalus ~]$ apt-cache depends git
git
Depends: libc6
Depends: libcurl3-gnutls
<...snip...>
Suggests: git-cvs
Suggests: git-svn
Suggests: git-email
<...snip...>
Recommends: rsync
<...snip...>
Conflicts: git-core
<...snip...>
Breaks: stgit
Breaks: stgit-contrib
Replaces: <cogito>
Replaces: git-core
... вы увидите это git
сам по себе имеет дальнейшие зависимости. Чтобы еще больше усложнить ситуацию, существуют разные виды зависимостей, кроме необходимости установки другого пакета ...
git
конфликтует с git-core
. На моей коробке здесь git-core
пакет отмечен как устаревший, вероятно, поэтому он и указан здесь.stgit
и stgit-contrib
пакеты будут считаться сломанными один раз git
установлен.git-core
пакет снова появляется здесь.Существуют также «мягкие» типы зависимостей, такие как Рекомендует и Предлагает, которые не обязательный пакетом, который вы устанавливаете, но рекомендуемые или предложил, как следует из названия. Еще раз, глядя на пример, предлагаемые и рекомендуемые пакеты являются надстройками к git или инструментами, не связанными напрямую, которые облегчат его использование.
Собрав все это вместе, менеджер пакетов, который вы используете, начнет с пакета (или пакетов), который вы попросили его установить, и будет искать для него зависимости, а затем любые зависимости для этих пакетов и так далее. Он также проверит пакеты, которые конфликтуют, нарушают или заменяют запрошенные пакеты или их зависимости. Как только он будет доволен, что нашел способ удовлетворить ваш первоначальный запрос, он продолжит установку.
У разных менеджеров пакетов есть разные способы сделать это разрешение зависимости. apt-get
, aptitude
и dselect
например, все по сути делают одно и то же, но по-разному принимают решения. Вы можете обнаружить, что aptitude
и dselect
с радостью представит вам способ установки пакета, тогда как apt-get
не могу.
Если вам интересно узнать больше о пакетах Debian, взгляните на Руководство для новых сопровождающих Debian, который проходит через некоторые кишки деб.
обычно apt сделает это за вас. если вы попытаетесь установить двоичный пакет с неудовлетворенными зависимостями, apt сообщит вам, какие из них отсутствуют, и запросит у вас разрешение на их установку.
большинство исходных кодов сообщают вам в файле README, каковы зависимости -dev.