Come posso determinare perché apt-get installerà un pacchetto?


18

Questa domanda è simile a Come posso sapere perché è stato installato un pacchetto? , ma nel mio caso vorrei sapere prima di installare effettivamente un pacchetto, perché installerà una dipendenza particolare.

Quindi, per esempio, potrei correre

sudo apt-get install superfoo

e l'output dirà qualcosa del tipo:

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

E questa potrebbe essere una lista davvero enorme. In alcuni casi vedrò qualcosa che verrà installato che non ha davvero senso per me dato quello che sto installando, quindi voglio sapere perché verrà installata quella particolare dipendenza.

Nell'esempio sopra, supponiamo che mi piacerebbe capire perché libderpverrebbe installato. So che in qualche modo esiste una catena di dipendenze tra superfooe libderpma l'enorme elenco di pacchetti da installare rende difficile vedere quale sia questa catena.

Una volta che conosco la catena di dipendenze, posso decidere se voglio davvero installare il pacchetto originale e / o se dovrei contattare il manutentore di quel pacchetto per vedere se hanno davvero bisogno di avere quelle dipendenze lì.


Se la risposta di qualcuno ti è stata utile, considera la possibilità di contrassegnarla come risposta accettata in modo che altri possano trovarla più facilmente in futuro. Questo è anche un modo educato per ringraziare la persona che ha risposto alla tua domanda per aiutarti.
Danatela,

Risposte:


14

Quello che sembra davvero chiederti è "Come faccio a rappresentare le dipendenze?" così puoi vedere quali pacchetti attirano in quali dipendenze.

Dal apt-cachecomando si ottengono dipendenze sia testuali che schematiche (incluse nel pacchetto apt, parte dell'installazione predefinita).

Ecco un esempio di apt-cache per elencare le dipendenze del pacchetto 'hello' in formato testo. L'output del testo sarà sempre solo di un livello.

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

Puoi leggere il diagramma usando qualsiasi dotfile viewer, come dotty(incluso nel pacchetto graphviz, anche parte dell'installazione predefinita)

Ecco un esempio di come ottenere l'intero albero delle dipendenze in formato grafico, quindi visualizzarlo. L'output grafico sarà sempre l'albero completo.

$ apt-cache dotty hello > dotfile
$ dotty dotfile

Guardandolo oltre, puoi vedere che il pacchetto 'ciao' contiene una tonnellata di pacchetti Perl ... e quale dipendenza lo fa.


Mentre funzionerebbe, sarebbe un lavoro serio farlo in questo modo per vedere cosa stava tirando in un certo pacchetto se il pacchetto fosse una dipendenza di una dipendenza.
tgm4883,

Affatto. Guarda semplicemente l'immagine del dotfile.
user535733

1
apt-cache depends --recurseti darà il quadro completo, ma apt-rdipende di seguito è meglio perché segue solo dipendenze effettive, non raccomandate o suggerite.
mhsmith,

Sebbene apt-get installerà effettivamente le dipendenze consigliate a meno che non si usi il --no-install-recommendsflag.
mhsmith,

2
Cosa significa quella barra? |
CMCDragonkai,

9

apt-rdependsfa questo, senza installare oltre 50 librerie di cruft come 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)

Sulla mia installazione pulita del server Ubuntu, apt-rdependsnecessaria solo libapt-pkg-perlper l'installazione. È molto più leggero allora ubuntu-dev-tools, eppure è ancora ricorsivo, quindi ottieni tutte le dipendenze, piuttosto che solo le dipendenze del primo ordine, come i apt-cache dependsritorni.


Scusate se ho frainteso, ma penso che apt-rdepends non sia lo stesso di reverse-dipende. apt-rdepends elenca le dipendenze ricorsive di un pacchetto, mentre reverse-depend elenca i pacchetti che dipendono dal pacchetto fornito.
rsuarez,

apt-rdepends -r elenca le dipendenze inverse.
Keith,

8

Potrebbe esserci un modo più semplice per farlo, ma può essere fatto se si utilizza il contrario. Dovrai installare il pacchetto ubuntu-dev-tools facendo ciò

apt-get install ubuntu-dev-tools

O facendo clic su questo pulsante:

Installa tramite il centro software

Una volta installato, è possibile utilizzare reverse-dip per vedere cosa dipende da un pacchetto specifico. Ad esempio, se provi a installare qualcosa che vuole installare un sacco di pacchetti extra e vuoi vedere perché "libsmpeg0" viene installato, esegui

reverse-depends libsmpeg0

Che produrrebbe il seguente.

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

Dai un'occhiata e vedi se il pacchetto che vuoi installare è in quell'elenco. In caso contrario, un altro dei pacchetti che vengono estratti durante l'installazione iniziale verrà visualizzato in tale elenco e sarà necessario eseguire l'inversione in base al pacchetto. Alla fine vedrai il pacchetto iniziale che vuoi installare in quell'elenco. A quel punto, dovresti avere una catena che mostra esattamente perché quel pacchetto è stato installato.

Come nota aggiuntiva, credo che la raccomandazione sia attiva per impostazione predefinita, quindi se qualcosa è impostato come raccomandazione verrà richiamato. Suggerisce se disattivato, ma il contrario dipende anche da quelle informazioni.


2
Anche se sono sicuro che questa risposta funzionerebbe, personifica il problema che l'OP sta cercando di evitare. ubuntu-dev-toolscomporta l'installazione dei seguenti pacchetti. 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
Nome falso

2
[continua] 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 (Nota: quanto sopra era solo i pacchetti richiesti da sudo apt-get install ubuntu-dev-toolsun'istanza del server Ubuntu abbastanza pulita). Se stai cercando di evitare di installare enormi quantità di cruft, questa è probabilmente la soluzione peggiore possibile.
Nome falso
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.