Comment puis-je déterminer pourquoi apt-get installera un package?

18

Cette question est similaire à Comment puis-je savoir pourquoi un package a été installé? , mais dans mon cas, j'aimerais savoir avant d' installer réellement un package, pourquoi il va installer une dépendance particulière.

Ainsi, par exemple, je pourrais courir

sudo apt-get install superfoo

et la sortie dira quelque chose comme:

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

Et cela pourrait être une liste vraiment énorme. Dans certains cas, je vais voir quelque chose qui va être installé qui n'a pas vraiment de sens pour moi étant donné ce que j'installe, donc je veux savoir pourquoi cette dépendance particulière va être installée.

Dans l'exemple ci-dessus, disons que j'aimerais comprendre pourquoi libderpserait installé. Je sais qu'il existe en quelque sorte une chaîne de dépendances entre superfooet, libderpmais l'énorme liste de packages à installer rend difficile de voir ce qu'est cette chaîne.

Une fois que je connais la chaîne de dépendance, je peux décider si je veux vraiment installer le package d'origine ou non, et / ou si je dois contacter le responsable de ce package pour voir s'il a vraiment besoin d'avoir ces dépendances là-bas.

pbouf77
la source
Si la réponse de quelqu'un vous a été utile, veuillez envisager de la marquer comme réponse acceptée afin que d'autres puissent la trouver plus facilement à l'avenir. C'est également une manière polie de remercier la personne qui a répondu à votre question de vous avoir aidé.
Danatela

Réponses:

14

Ce que vous semblez vraiment demander, c'est "Comment puis-je représenter les dépendances?" afin que vous puissiez voir quels packages tirent dans quelles dépendances.

Vous obtenez à la fois le texte et les dépendances schématiques de la apt-cachecommande (incluse dans le package apt, qui fait partie de l'installation par défaut).

Voici un exemple d'apt-cache pour lister les dépendances du paquet 'hello' au format texte. La sortie de texte sera toujours d'un seul niveau.

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

Vous pouvez lire le diagramme à l'aide de n'importe quel visualiseur de fichiers dot, tel que dotty(inclus dans le package graphviz, également inclus dans l'installation par défaut)

Voici un exemple pour obtenir l'arborescence de dépendances complète au format graphique, puis l'afficher. La sortie graphique sera toujours l'arborescence complète.

$ apt-cache dotty hello > dotfile
$ dotty dotfile

En y jetant un coup d'œil, vous pouvez voir que le paquet 'hello' attire une tonne de paquets Perl ... et quelle dépendance le fait.

user535733
la source
Bien que cela fonctionnerait, ce serait un travail sérieux de le faire de cette façon pour voir ce qui tirait dans un certain package si le package était une dépendance d'une dépendance.
tgm4883
Pas du tout. Regardez simplement l'image dotfile.
user535733
1
apt-cache depends --recursevous donnera l'image complète, mais apt-rdepends ci-dessous est meilleur car il ne suit que les dépendances réelles, non recommandées ou suggérées.
mhsmith
Bien qu'apt-get installe en fait les dépendances recommandées, sauf si vous utilisez l' --no-install-recommendsindicateur.
mhsmith
2
Que signifie cette barre? |
CMCDragonkai
9

apt-rdependsfait cela, sans installer plus de 50 bibliothèques de cruft comme 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)

Sur mon installation propre du serveur Ubuntu, apt-rdependsrequis uniquement libapt-pkg-perlpour l'installation. Il est alors beaucoup plus léger ubuntu-dev-toolset pourtant récursif, vous obtenez donc toutes les dépendances, plutôt que les dépendances de premier ordre, comme les apt-cache dependsretours.

Faux nom
la source
Désolé si j'ai mal compris, mais je pense que apt-rdepends n'est pas la même chose que reverse-depend. apt-rdepends répertorie les dépendances récursives d'un package, tandis que reverse-depend répertorie les packages qui dépendent du package donné.
rsuarez
apt-rdepends -r répertorie les dépendances inverses.
Keith
8

Il peut y avoir un moyen plus simple de le faire, mais cela peut être fait si vous utilisez le reverse-depend. Vous devrez installer le paquet ubuntu-dev-tools en faisant

apt-get install ubuntu-dev-tools

Ou en cliquant sur ce bouton:

Installer via le centre logiciel

Une fois installé, vous pouvez ensuite utiliser reverse-depend pour voir ce qui dépend d'un package spécifique. Par exemple, si vous essayez d'installer quelque chose qui veut installer un tas de paquets supplémentaires et que vous voulez voir pourquoi "libsmpeg0" est installé, vous exécutez

reverse-depends libsmpeg0

Ce qui produirait ce qui suit.

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

Jetez un œil et voyez si le package que vous souhaitez installer figure dans cette liste. Si ce n'est pas le cas, un autre des packages extraits lors de cette installation initiale s'affichera dans cette liste et vous devrez exécuter la procédure inverse en fonction de ce package. Finalement, vous verrez le package initial que vous souhaitez installer dans cette liste. À ce stade, vous devriez avoir une chaîne indiquant exactement pourquoi ce package a été installé.

En tant que note supplémentaire, je pense que la recommandation est activée par défaut, donc si quelque chose est défini comme une recommandation, il sera récupéré. Suggère si elle est désactivée, mais la fonction inverse peut également afficher ces informations.

tgm4883
la source
2
Bien que je sois sûr que cette réponse fonctionnerait, elle personnifie le problème que le PO essaie d'éviter. ubuntu-dev-toolsentraîne l'installation des packages suivants. 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
Fake Name
2
[suite] 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 (Remarque: ce qui précède n'était que les packages requis sudo apt-get install ubuntu-dev-toolssur une instance de serveur ubuntu assez propre). Si vous essayez d' éviter d' installer d'énormes quantités de cruches, c'est probablement la pire solution possible.
Fake Name