Jak mogę ustalić, dlaczego apt-get zainstaluje pakiet?

18

To pytanie jest podobne do Jak dowiedzieć się, dlaczego pakiet został zainstalowany? , ale w moim przypadku chciałbym wiedzieć przed zainstalowaniem pakietu, dlaczego zainstaluje on określoną zależność.

Na przykład mogę uruchomić

sudo apt-get install superfoo

a wynik powie coś takiego:

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

To może być naprawdę ogromna lista. W niektórych przypadkach zobaczę coś, co zostanie zainstalowane, co nie ma dla mnie sensu, biorąc pod uwagę to, co instaluję, więc chcę wiedzieć, dlaczego ta konkretna zależność zostanie zainstalowana.

W powyższym przykładzie powiedzmy, że chciałbym zrozumieć, dlaczego libderpzostałby zainstalowany. Wiem, że jakoś tam to sieć zależności między superfooa libderpjednak ogromna lista pakietów do zainstalowania sprawia, że trudno zrozumieć, co to jest łańcuch.

Gdy poznam łańcuch zależności, mogę zdecydować, czy naprawdę chcę zainstalować oryginalny pakiet, czy nie i / lub czy powinienem skontaktować się z opiekunem tego pakietu, aby sprawdzić, czy naprawdę muszą mieć te zależności.

pbouf77
źródło
Jeśli czyjaś odpowiedź była dla Ciebie pomocna, rozważ oznaczenie jej jako odpowiedzi zaakceptowanej, aby inni mogli łatwiej ją znaleźć w przyszłości. Jest to również uprzejmy sposób podziękowania osobie odpowiadającej na twoje pytanie za pomoc.
Danatela,

Odpowiedzi:

14

Naprawdę pytasz: „Jak wykreślić zależności?” dzięki czemu można zobaczyć, które pakiety ściągają zależności.

Zależności tekstowe i diagramowe otrzymujesz z apt-cachepolecenia (zawarte w pakiecie apt, część domyślnej instalacji).

Oto przykład apt-cache do wyświetlania zależności pakietu „hello” w formacie tekstowym. Tekst zawsze będzie miał tylko jeden poziom.

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

Możesz odczytać diagram za pomocą dowolnej przeglądarki plików kropkowych, takiej jak dotty(zawarta w pakiecie graphviz, również stanowiąca część instalacji domyślnej)

Oto przykład uzyskania pełnego drzewa zależności w formacie graficznym, a następnie jego wyświetlenie. Wyjściem graficznym zawsze będzie pełne drzewo.

$ apt-cache dotty hello > dotfile
$ dotty dotfile

Przeglądając to, możesz zobaczyć, że pakiet „hello” ściąga tonę pakietów Perla ... i która to zależność.

użytkownik535733
źródło
Chociaż to zadziałałoby, poważną pracą byłoby zrobienie tego w ten sposób, aby zobaczyć, co ściągało pewien pakiet, jeśli pakiet był zależny od zależności.
tgm4883
Ani trochę. Wystarczy spojrzeć na obraz pliku kropkowego.
user535733,
1
apt-cache depends --recurseda ci pełny obraz, ale apt-rdepends poniżej jest lepszy, ponieważ śledzi tylko rzeczywiste zależności, niezalecane ani sugerowane.
msmsm
Chociaż apt-get faktycznie zainstaluje zalecane zależności, chyba że użyjesz --no-install-recommendsflagi.
mhsmith
2
Co oznacza ten pasek? |
CMCDragonkai
9

apt-rdependsrobi to bez instalowania ponad 50 bibliotek cruft like 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)

Na mojej czystej instalacji serwera Ubuntu jest apt-rdependswymagana tylko libapt-pkg-perldo instalacji. Jest wtedy znacznie lżejszy ubuntu-dev-tools, a jednak wciąż rekurencyjny, więc otrzymujesz wszystkie zależności, a nie tylko zależności pierwszego rzędu, takie jak apt-cache dependszwroty.

Zmyślone imię
źródło
Przepraszam, jeśli źle zrozumiałem, ale myślę, że apt-rdepends to nie to samo co odwrotne. apt-rdepends wyświetla rekurencyjne zależności pakietu, podczas gdy reverse-depend wyświetla pakiety zależne od danego pakietu.
rsuarez,
apt-rdepends -r wyświetla odwrotne zależności.
Keith
8

Może to być łatwiejszy sposób, ale można to zrobić, jeśli używasz odwrotnego polecenia. W tym celu musisz zainstalować pakiet ubuntu-dev-tools

apt-get install ubuntu-dev-tools

Lub klikając ten przycisk:

Zainstaluj za pośrednictwem centrum oprogramowania

Po zainstalowaniu możesz użyć odwrotnego polecenia, aby zobaczyć, co zależy od konkretnego pakietu. Na przykład, jeśli próbujesz zainstalować coś, co chce zainstalować kilka dodatkowych pakietów i chcesz zobaczyć, dlaczego instalowane jest „libsmpeg0”, uruchom

reverse-depends libsmpeg0

Co wygeneruje następujące.

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

Zobacz, czy pakiet, który chcesz zainstalować, znajduje się na tej liście. Jeśli nie, to na liście pojawi się kolejny pakiet, który jest pobierany podczas tej pierwszej instalacji, i będziesz musiał uruchomić odwrotnie, zależnie od tego pakietu. W końcu zobaczysz na liście początkowy pakiet, który chcesz zainstalować. W tym momencie powinieneś mieć łańcuch pokazujący dokładnie, dlaczego ten pakiet został zainstalowany.

Jako dodatkową notatkę, uważam, że zalecane są domyślnie włączone, więc jeśli coś zostanie ustawione jako rekomendacje, zostanie wciągnięte do. Sugeruje, że jest wyłączone, ale funkcja odwrotnego wyświetlania może również wyświetlać te informacje.

tgm4883
źródło
2
Chociaż jestem pewien, że ta odpowiedź zadziała, uosabia problem, którego OP próbuje uniknąć. ubuntu-dev-toolspowoduje zainstalowanie następujących pakietów. 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
Fałszywe imię
2
[ciąg dalszy] 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 (Uwaga: powyższe były tylko wymagane pakiety z sudo apt-get install ubuntu-dev-toolsdość czystej instancji serwera ubuntu). Jeśli próbujesz uniknąć instalowania dużych ilości cruft, jest to prawdopodobnie najgorsze możliwe rozwiązanie.
Fałszywe imię