如何确定apt-get为什么会安装软件包?


18

这个问题类似于我如何找出安装软件包的原因?,但就我而言,实际安装软件包之前,我想知道为什么它会安装特定的依赖项。

例如,我可能会跑步

sudo apt-get install superfoo

然后输出将显示类似以下内容:

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

这可能是一个非常庞大的清单。在某些情况下,我将看到要安装的东西,鉴于我要安装的东西,这对我来说真的没有任何意义,因此我想知道为什么要安装该特定的依赖项。

在上面的示例中,假设我想了解为什么libderp要安装。我知道之间存在某种依赖关系superfoolibderp但是要安装的软件包列表很大,因此很难知道这个依赖关系是什么。

一旦知道了依赖链,就可以决定是否真的要安装原始软件包,和/或是否应该与该软件包的维护者联系,以了解他们是否真的需要在那里安装这些依赖。


如果某人的答案对您有所帮助,请考虑将其标记为接受的答案,以便其他人将来可以更轻松地找到它。这也是一种礼貌的方式,要感谢回答您问题的人为您提供帮助。
Danatela

Answers:


14

您似乎真正要问的是“如何绘制依赖关系图?” 这样您就可以看到哪些包引入了哪些依赖关系。

您可以从apt-cache命令中获得文本和图表相关性(包含在apt软件包中,是默认安装的一部分)。

这是一个apt-cache的示例,用于以文本格式列出“ hello”包的依赖项。文本输出将始终仅是一个级别。

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

您可以使用任何点文件查看器来读取该图,例如dotty(包括在graphviz软件包中,也是默认安装的一部分)

这是一个以图形格式获取完整的依赖树,然后显示它的示例。图形输出将始终是完整的树。

$ apt-cache dotty hello > dotfile
$ dotty dotfile

仔细研究一下,您会发现'hello'软件包引入了大量的Perl软件包...以及哪个依赖项。


尽管这行得通,但是以这种方式进行操作以查看如果某个软件包是某个依赖项的依赖项,则要查看某个软件包中的内容是一项艰巨的工作。
tgm4883 2012年

一点也不。只看点文件图片。
user535733

1
apt-cache depends --recurse可以为您提供全面的信息,但是下面的apt-rdepends更好,因为它仅遵循实际的依赖关系,而不是推荐或建议的依赖关系。
mhsmith

尽管apt-get实际上将安装建议的依赖项,除非您使用该--no-install-recommends标志。
mhsmith

2
那条是什么意思?|
CMCDragonkai 2015年

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 depends返回一阶依赖关系,例如返回。


抱歉,如果我误解了,但是我认为apt-rdepends与反向依赖不一样。apt-rdepends列出软件包的递归依赖性,而reverse-depends列出依赖给定软件包的软件包。
rsuarez '16

apt-rdepends -r列出反向依赖关系。
基思2016年

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

查看一下您要安装的软件包是否在该列表中。如果不是,那么在该初始安装期间拉入的另一个软件包将显示在该列表中,并且您将需要反向运行该软件包。最终,您将在该列表中看到要安装的初始软件包。到那时,您应该有一条链显示确切的安装该软件包的原因。

另外,我相信默认情况下,recommendations已启用,因此,如果将某些内容设置为recommendations,则会将其引入。建议是否关闭,但反向依赖关系也可以显示该信息。


2
虽然我敢肯定,这个答案是可行的,但它可以体现出OP试图避免的问题。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服务器实例上的必需软件包)。如果要避免安装大量的碎屑,这可能是最糟糕的解决方案。
假名称
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.