Как я могу определить, почему apt-get установит пакет?

18

Этот вопрос похож на Как я могу узнать, почему был установлен пакет? , но в моем случае я хотел бы знать перед установкой пакета, почему он будет устанавливать конкретную зависимость.

Так, например, я мог бы запустить

sudo apt-get install superfoo

и результат скажет что-то вроде:

The following extra packages will be installed:
  foo bar baz ... libderp libjunk

И это может быть действительно огромный список. В некоторых случаях я увижу что-то, что будет установлено, что не имеет смысла для меня, учитывая то, что я устанавливаю, поэтому я хочу знать, почему именно эта зависимость будет установлена.

В приведенном выше примере, скажем, я хотел бы понять, почему libderpбудет установлен. Я знаю , что - то есть цепочка зависимостей между superfooи libderpно огромный список пакетов , которые будут установлены делает его трудно увидеть , что эта цепь.

Зная цепочку зависимостей, я могу решить, действительно ли я хочу установить исходный пакет или нет, и / или должен ли я связаться с сопровождающим этого пакета, чтобы узнать, действительно ли им нужны эти зависимости.

pbouf77
источник
Если чей-то ответ был вам полезен, тогда пометьте его как принятый, чтобы другим было легче найти его в будущем. Это также вежливый способ поблагодарить человека, отвечающего на ваш вопрос, за помощь.
Данатела

Ответы:

14

То, что вы на самом деле спрашиваете: «Как я могу изобразить зависимости?» так что вы можете видеть, какие пакеты в каких зависимостях.

Вы получаете текстовые и диаграммные зависимости из apt-cacheкоманды (входит в пакет apt, часть установки по умолчанию).

Вот пример apt-cache для перечисления зависимостей пакета 'hello' в текстовом формате. Вывод текста всегда будет только одного уровня.

$ apt-cache depends hello
hello
  Depends: libc6
 |Depends: dpkg
  Depends: install-info

Вы можете прочитать диаграмму с помощью любого средства просмотра dottydotfile , такого как (входит в пакет graphviz, также является частью установки по умолчанию)

Вот пример получения полного дерева зависимостей в графическом формате с последующим его отображением. Графический вывод всегда будет полным деревом.

$ apt-cache dotty hello > dotfile
$ dotty dotfile

Просматривая его, вы можете видеть, что пакет 'hello' загружает тонну пакетов Perl ... и какая зависимость это делает.

user535733
источник
Хотя это сработает, было бы довольно серьезно проделать это таким образом, чтобы увидеть, что тянет в определенном пакете, если пакет является зависимостью от зависимости.
tgm4883
Не за что. Просто посмотрите на картинку с точечным файлом.
user535733
1
apt-cache depends --recurseдаст вам полную картину, но apt-rdepends ниже лучше, потому что он следует только фактическим зависимостям, а не рекомендуемым или предлагаемым.
мссмит
Хотя apt-get фактически установит рекомендуемые зависимости, если вы не используете --no-install-recommendsфлаг.
мсмит
2
Что означает этот бар? |
CMCDragonkai
9

apt-rdependsделает это, не устанавливая более 50 библиотек типа cruft ubuntu-dev-tools.

durr@scraper:~$ apt-rdepends mercurial
Reading package lists... Done
Building dependency tree
Reading state information... Done
mercurial
  Depends: libc6 (>= 2.14)
  Depends: mercurial-common (= 2.8.2-1ubuntu1)
  Depends: python (<< 2.8)
  Depends: ucf (>= 2.0020)
libc6
  Depends: libgcc1
libgcc1
  Depends: gcc-4.9-base (= 4.9-20140406-0ubuntu1)
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
gcc-4.9-base
multiarch-support
  Depends: libc6 (>= 2.3.6-2)
mercurial-common
  Depends: python (<< 2.8)
  Depends: python:any (>= 2.7.1-0ubuntu2)
python
  Depends: libpython-stdlib (= 2.7.5-5ubuntu3)
  Depends: python-minimal (= 2.7.5-5ubuntu3)
  Depends: python2.7 (>= 2.7.5-1~)
libpython-stdlib
  Depends: libpython2.7-stdlib (>= 2.7.5-1~)
libpython2.7-stdlib
  Depends: libbz2-1.0
  Depends: libc6 (>= 2.15)
  Depends: libdb5.3
  Depends: libexpat1 (>= 2.1~beta3)
  Depends: libffi6 (>= 3.0.4)
  Depends: libncursesw5 (>= 5.6+20070908)
  Depends: libpython2.7-minimal (= 2.7.6-8)
  Depends: libreadline6 (>= 6.0)
  Depends: libsqlite3-0 (>= 3.5.9)
  Depends: libssl1.0.0 (>= 1.0.0)
  Depends: libtinfo5
  Depends: mime-support
libbz2-1.0
  Depends: libc6 (>= 2.4)
  PreDepends: multiarch-support
libdb5.3
  Depends: libc6 (>= 2.17)
  PreDepends: multiarch-support
libexpat1
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
libffi6
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
libncursesw5
  Depends: libc6 (>= 2.15)
  Depends: libtinfo5 (= 5.9+20140118-1ubuntu1)
  PreDepends: multiarch-support
libtinfo5
  Depends: libc6 (>= 2.15)
  PreDepends: multiarch-support
libpython2.7-minimal
libreadline6
  Depends: libc6 (>= 2.15)
  Depends: libtinfo5
  Depends: readline-common
  PreDepends: multiarch-support
readline-common
  Depends: dpkg (>= 1.15.4)
  Depends: install-info
dpkg
  PreDepends: libbz2-1.0
  PreDepends: libc6 (>= 2.14)
  PreDepends: liblzma5 (>= 5.1.1alpha+20120614)
  PreDepends: libselinux1 (>= 2.1.0)
  PreDepends: tar (>= 1.23)
  PreDepends: zlib1g (>= 1:1.1.4)
liblzma5
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
libselinux1
  Depends: libc6 (>= 2.14)
  Depends: libpcre3
  PreDepends: multiarch-support
libpcre3
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
tar
  PreDepends: libacl1 (>= 2.2.51-8)
  PreDepends: libc6 (>= 2.17)
  PreDepends: libselinux1 (>= 1.32)
libacl1
  Depends: libattr1 (>= 1:2.4.46-8)
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
libattr1
  Depends: libc6 (>= 2.4)
  PreDepends: multiarch-support
zlib1g
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
install-info
  Depends: libc6 (>= 2.14)
  PreDepends: dpkg (>= 1.16.1)
libsqlite3-0
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
libssl1.0.0
  Depends: debconf (>= 0.5)
  Depends: debconf-2.0
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
debconf
  PreDepends: perl-base (>= 5.6.1-4)
perl-base
  PreDepends: dpkg (>= 1.14.20)
  PreDepends: libc6 (>= 2.14)
debconf-2.0
mime-support
python-minimal
  Depends: dpkg (>= 1.13.20)
  Depends: python2.7-minimal (>= 2.7.5-1~)
python2.7-minimal
  Depends: libpython2.7-minimal (= 2.7.6-8)
  Depends: zlib1g (>= 1:1.2.0)
  PreDepends: libc6 (>= 2.15)
python2.7
  Depends: libpython2.7-stdlib (= 2.7.6-8)
  Depends: mime-support
  Depends: python2.7-minimal (= 2.7.6-8)
python:any
ucf
  Depends: coreutils (>= 5.91)
  Depends: debconf (>= 1.5.19)
coreutils
  PreDepends: libacl1 (>= 2.2.51-8)
  PreDepends: libattr1 (>= 1:2.4.46-8)
  PreDepends: libc6 (>= 2.17)
  PreDepends: libselinux1 (>= 1.32)

На моем чистом сервере Ubuntu установить, apt-rdependsтребуется только libapt-pkg-perlдля установки. Тогда он намного легче ubuntu-dev-toolsи все же рекурсивен, поэтому вы получаете все зависимости, а не только зависимости первого порядка, такие как apt-cache dependsreturn.

Поддельное имя
источник
Извините, если я неправильно понял, но я думаю, что apt-rdepends - это не то же самое, что обратная зависимость. apt-rdepends перечисляет рекурсивные зависимости пакета, в то время как reverse-зависимость перечисляет пакеты, которые зависят от данного пакета.
rsuarez
apt-rdepends -r перечисляет обратные зависимости.
Кит
8

Может быть более простой способ сделать это, но это может быть сделано, если вы используете обратную зависимость. Вам нужно будет установить пакет ubuntu-dev-tools, выполнив

apt-get install ubuntu-dev-tools

Или нажав эту кнопку:

Установить через центр программного обеспечения

После установки вы можете использовать обратную зависимость, чтобы увидеть, что зависит от конкретного пакета. Например, если вы пытаетесь установить что-то, что хочет установить кучу дополнительных пакетов, и вы хотите увидеть, почему устанавливается «libsmpeg0», вы запускаете

reverse-depends libsmpeg0

Что бы вывести следующее.

Reverse-Recommends
==================
* sandboxgamemaker

Reverse-Depends
===============
* btanks
* fenix-plugin-mpeg [armel armhf i386 powerpc]
* fillets-ng
* gltron [amd64 armel i386 powerpc]
* libalien-sdl-perl
* libsdl-perl [i386]
* libsmpeg-dev
* libtaoframework-sdl1.2-cil
* python-pygame
* ruby-sdl
* sdlbrt
* smpeg-gtv
* smpeg-plaympeg
* tdfsb

Packages without architectures listed are reverse-dependencies in: amd64, armel, armhf, i386, powerpc

Посмотрите, есть ли пакет, который вы хотите установить, в этом списке. Если нет, то в этом списке появится еще один пакет, который загружается во время первоначальной установки, и вам нужно будет выполнить обратное действие в зависимости от этого пакета. В конце концов вы увидите начальный пакет, который вы хотите установить в этом списке. На этом этапе у вас должна быть цепочка, показывающая, почему именно этот пакет был установлен.

Как добавленное примечание, я полагаю, что рекомендует, по умолчанию, включен, поэтому, если что-то установлено как рекомендация, оно будет включено. Предлагает, если выключено, но обратная зависимость может также показать эту информацию.

tgm4883
источник
2
Хотя я уверен, что этот ответ сработает, он олицетворяет проблему, которую ОП пытается избежать. ubuntu-dev-toolsприводит к установке следующих пакетов. bzr bzr-builddeb dctrl-tools debian-archive-keyring debian-keyring debootstrap devscripts diffstat distro-info distro-info-data dput genisoimage gettext hardening-includes intltool-debian libapt-pkg-perl libarchive-zip-perl libasprintf-dev libassuan0 libauthen-sasl-perl libautodie-perl libclone-perl libcommon-sense-perl libcroco3 libdigest-hmac-perl libdistro-info-perl libemail-valid-perl libencode-locale-perl liberror-perl
Фальшивое имя
2
[продолжение] python-launchpadlib python-lazr.restfulclient python-lazr.uri python-oauth python-paramiko python-reportbug python-secretstorage python-simplejson python-soappy python-support python-wadllib python3-debian python3-magic quilt reportbug t1utils unzip wdiff xdelta (Примечание. Выше были только необходимые пакеты sudo apt-get install ubuntu-dev-toolsна довольно чистом экземпляре сервера Ubuntu). Если вы пытаетесь избежать установки огромного количества мусора, это, вероятно, худшее из возможных решений.
Фальшивое имя