Як я можу визначити, чому apt-get встановить пакет?


18

Це питання схоже на Як я можу дізнатися, чому встановлено пакет? , але в моєму випадку я хотів би знати, перш ніж встановлювати пакет, чому він встановить певну залежність.

Так, наприклад, я можу бігати

sudo apt-get install superfoo

і вихід скаже щось на кшталт:

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

І це може бути справді величезний список. У деяких випадках я побачу щось, що буде встановлено, що насправді не має сенсу для мене з огляду на те, що я встановлюю, тому я хочу знати, чому саме ця залежність буде встановлена.

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

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


Якщо хтось відповідь був для вас корисним, то, будь ласка, розгляньте це як прийняту відповідь, щоб інші могли легше знайти її в майбутньому. Це також ввічливий спосіб подякувати людині, яка відповіла на ваше запитання, що допомогла вам.
Данатела

Відповіді:


14

Те, що ви насправді запитуєте, - це "Як я діагностую залежності?" тож ви можете бачити, які пакети тягнуть, в яких залежностях.

Ви отримуєте як текстову, так і діаграмовану залежності від apt-cacheкоманди (включена в пакет apt, частина встановлення за замовчуванням).

Ось приклад apt-кеша для перерахування залежностей пакету 'привіт' у текстовому форматі. Виведення тексту завжди буде лише одного рівня.

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

Діаграму можна прочитати, використовуючи будь-який переглядач dotfile, наприклад dotty(включений у пакунок graphviz, також частина встановлення за замовчуванням)

Ось приклад отримання повного дерева залежності у графічному форматі та його відображення. Графічний вихід завжди буде повним деревом.

$ apt-cache dotty hello > dotfile
$ dotty dotfile

Переглянувши це, ви можете побачити, що пакет "привіт" складається в тоні пакетів Perl ... і яка залежність це робить.


Хоча це спрацювало б, було б серйозною роботою зробити це таким чином, щоб побачити, що тягне в певному пакеті, якщо пакет був залежним від залежності.
tgm4883

Зовсім ні. Просто подивіться на малюнок dotfile.
user535733

1
apt-cache depends --recurseдасть вам повну картину, але влучні rdepends внизу краще, тому що вони відповідають лише фактичним залежностям, а не рекомендованим або запропонованим.
mhsmith

Хоча apt-get насправді встановить рекомендовані залежності, якщо ви не використовуєте --no-install-recommendsпрапор.
mhsmith

2
Що означає ця планка? |
CMCDragonkai

9

apt-rdependsробить це, не встановлюючи 50+ подібних бібліотек 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 dependsприбутки.


Вибачте, якщо я неправильно зрозумів, але я думаю, що apt-rdepends - це не те саме, що залежить від зворотного. apt-rdepends перераховує рекурсивні залежності пакету, тоді як зворотна залежність перераховує пакети, які залежать від заданого пакету.
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

Погляньте і перевірте, чи є пакет, який ви хочете встановити, у цьому списку. Якщо ні, то ще один із пакунків, який витягується під час первинної інсталяції, з’явиться у цьому списку, і вам потрібно буде запустити зворотну залежність від цього пакету. Згодом ви побачите початковий пакет, який ви хочете встановити у цьому списку. У цей момент у вас повинен з’явитися ланцюжок, який точно показує, чому саме цей пакет був встановлений.

Як додана примітка, я вважаю, що рекомендується увімкнути функцію за замовчуванням, тому якщо щось встановлено як рекомендоване, воно потягнеться за собою. Пропонує, якщо вимкнено, але ця інформація може відображатись і на зворотному рівні.


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). Якщо ви намагаєтесь уникнути встановлення величезної кількості шахти, це, мабуть, найгірше можливе рішення.
Підроблене ім’я
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.