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

pbo*_*f77 27 dependencies

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

所以例如我可能会跑

sudo apt-get install superfoo
Run Code Online (Sandbox Code Playgroud)

输出将显示如下内容:

The following extra packages will be installed:
  foo bar baz ... libderp libjunk
Run Code Online (Sandbox Code Playgroud)

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

在上面的例子中,假设我想了解为什么libderp会被安装。我知道以某种方式在superfoo和之间存在依赖链,libderp但是要安装的大量软件包列表使得很难看到这条链是什么。

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

use*_*733 18

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

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

这是一个 apt-cache 示例,用于以文本格式列出 'hello' 包的依赖项。文本输出将始终只有一层。

$ apt-cache depends hello
hello
  Depends: libc6
 |Depends: dpkg
  Depends: install-info
Run Code Online (Sandbox Code Playgroud)

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

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

$ apt-cache dotty hello > dotfile
$ dotty dotfile
Run Code Online (Sandbox Code Playgroud)

查看它,您可以看到 'hello' 包引入了大量 Perl 包......以及哪个依赖项完成了它。

  • `apt-cache depends --recurse` 会给你一个完整的图片,但下面的 apt-rdepends 更好,因为它只遵循实际的依赖关系,而不是推荐或建议的依赖关系。 (3认同)
  • 那个酒吧是什么意思?`|` (3认同)

Fak*_*ame 14

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)
Run Code Online (Sandbox Code Playgroud)

在我干净的 ubuntu 服务器安装上,apt-rdepends只需要libapt-pkg-perl安装。then 轻得多ubuntu-dev-tools,但仍然是递归的,因此您可以获得所有依赖项,而不仅仅是一阶依赖项,如apt-cache depends返回。

  • apt-rdepends -r 列出反向依赖关系。 (2认同)

pma*_*ycz 13

人们可以使用内置的 APT 调试选项从解析器了解底层依赖关系树。

apt.conf(5)

调试::pkgDepCache::自动安装

生成调试消息,描述自动安装哪些包来解决依赖关系。这对应于在 apt-get install 等中执行的初始自动安装过程,而不是完整的 apt 依赖解析器;请参阅 Debug::pkgProblemResolver 来了解这一点。

$ apt install -s -o Debug::pkgDepCache::AutoInstall=true mercurial
Reading package lists... Done
Building dependency tree       
Reading state information... Done
  Installing mercurial-common as Depends of mercurial
    Installing python2 as Depends of mercurial-common
      Installing python2-minimal as PreDepends of python2
        Installing python2.7-minimal as Depends of python2-minimal
          Installing libpython2.7-minimal as Depends of python2.7-minimal
      Installing python2.7 as Depends of python2
        Installing libpython2.7-stdlib as Depends of python2.7
      Installing libpython2-stdlib as Depends of python2
The following additional packages will be installed:
  libpython2-stdlib libpython2.7-minimal libpython2.7-stdlib mercurial-common python2 python2-minimal python2.7 python2.7-minimal
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是真实的,不知道为什么人们否决了它。请注意,引用的输出将发送到 stderr,例如,如果您使用 grep,这一点很重要 (2认同)
  • 正是我正在寻找的!这非常好,因为它不需要额外的依赖项 (2认同)

tgm*_*883 8

可能有一种更简单的方法可以做到这一点,但如果您使用反向依赖,则可以做到。您需要通过执行以下操作来安装 ubuntu-dev-tools 软件包

apt-get install ubuntu-dev-tools

或者通过单击此按钮:

通过软件中心安装

安装后,您可以使用 reverse-depends 来查看依赖于特定包的内容。例如,如果您尝试安装一些想要安装一堆额外软件包的东西,并且您想了解安装“libsmpeg0”的原因,您可以运行

reverse-depends libsmpeg0
Run Code Online (Sandbox Code Playgroud)

这将输出以下内容。

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
Run Code Online (Sandbox Code Playgroud)

看一看您要安装的软件包是否在该列表中。如果没有,那么在初始安装期间引入的另一个包将显示在该列表中,您将需要运行 reverse-depends 到该包。最终,您将在该列表中看到要安装的初始软件包。那时,您应该有一个链,显示安装该软件包的确切原因。

作为补充说明,我相信默认情况下推荐是启用的,因此如果将某些内容设置为推荐,它将被拉入。建议是否关闭,但反向依赖也可以显示该信息。

  • 虽然我确信这个答案会奏效,但它代表了 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-wadlib python3-debian python3-magic quilt reportbug t1utils unzip wdiff xdelta`(注意:以上*只是*来自相当干净的ubuntu服务器实例上的`sudo apt-get install ubuntu-dev-tools`所需的包)。如果你试图*避免*安装大量的垃圾,这可能是最糟糕的解决方案。 (2认同)