如何列出依赖包(反向依赖)?


201

为了研究导致给定软件包安装的原因,我想获取依赖于该软件包的软件包列表。我在中找不到任何明显的内容man dpkg



5
较老的问题的答案全都围绕着aptitude,这已经多年未默认安装。在2017年,Ubuntu上的每个人仍然拥有apt-cache。遵循链接的问题的任何人都会在关于很少有人拥有的程序的讨论中迷路。
兰巴特

Answers:


252

apt-cache rdepends packagename 应该做你想做的


1
优秀的!apt-cache rdepends tofrodos确认怀疑它是由另一个软件包(已废弃dos2unix)安装的。
l0b0 2012年

2
对于今天(apt版本0.9.9.1),有--recurse选项可与rdepends一起使用。
jarno 2013年

43
如果添加--installed,则输出对于可被许多其他程序使用的包甚至很有用:apt-cache rdepends --installed packagename
quazgar 2014年

2
语法略有不同,可以帮助我区分“推荐”,“依赖”,“建议”等。语法是sudo apt rdepends packagename(请注意,它不是在使用apt-cache,而只是在使用apt)
Vahid Pazirandeh

4
对于输出,为什么有些包装在它们前面有竖线(竖线符号)?
Vahid Pazirandeh

62

aptitude有一个相当不错的方式来处理此问题:

$ aptitude why bash
i   foomatic-filters PreDepends bash (>= 2.05)

默认情况下,它仅列出“安装最多,最坚固,最紧密,最短”的原因,但您可以使用aptitude -v why它来输出找到的所有内容。


4
似乎它只考虑已安装的软件包,而不考虑所有可用的软件包。这就是我所需要的。
Tuukka Mustonen

3
对于要reverse-dependsubuntu-dev-tools
旋风的

Debian呢?
Tuukka Mustonen

1
ubuntu-dev-tools在Debian中
风滚草

这很棒。我了解到openssh-server 建议(并因此安装)xauth在无头服务器上,每个月拖入数百个 x11依赖项和数十个无用的更新。这就是自动化包装管理的问题!
BaseZen

18
apt-cache showpkg <pkgname> 

例:

apt-cache showpkg lightdm

当前语法apt showpkg <pkgname>
l --marc l

16

有不止一种方法,每种方法都显示不同的输出。

有关完整的反向依赖关系树的详细视图;

aptitude install apt-rdepends
apt-rdepends -r bash

或者

apt-cache showpkg bash

或简明清单:

apt-cache rdepends bash

rdepends那棵树到底显示了什么?apt-rdepends php7.0-fpm显示sedsed不依赖于PHP,更不用说PHP FPM了。
Dan Dascalescu

它是反向依赖的,这意味着PHP依赖sed。
Erik Berkun-Drevnig '18

1
大家好,实际上“ apt-rdepends”代表“递归依赖性”。如果要反向递归依赖性,则必须键入:apt-rdepends -r yourPackageNameHere
SebMa '18

apt-cache手册页显示“ rdepends显示软件包具有的每个反向依赖关系的列表”。正如@SebMa所说,而apt-rdepends需要-r选项来进行反向依赖。
NeilG

8

最简单的选项仍然是:

apt rdepends package-name

这不需要您安装任何软件包。


1
这对接受的答案有什么作用?
l0b0

2
可接受的答案与此无关。输出是完全不同的,并且比apt-cache的输出对人类更有用。答案提到默认情况下并非在所有位置都安装apt-cache-仅此一个很好的提示,说明了此答案的目的。最后,这实际上是我一直在寻找的答案,因此任何不赞成投票的人都相当愚蠢。
stefanct

为什么它比接受的版本更好的一个非常重要的原因是,它包含了依赖项的版本,这与apt-caches的输出不同。这正是我现在需要的(调试glibc 2.28不兼容,因此颇受好评)
Per Lundberg

赞成使用apt。在给出原始答案时,我不确定这个适当的解决方案是否有效,但是如果是现在,那就很好了。
RobotHumans

7

除了其他好的答案之外,APT / APT-GET -s还执行“模拟”删除(或安装)。

sudo apt -s remove <pkgname>

使用-s--simulated删除(或安装)软件包通常会列出所有受影响的依赖项。删除时将显示孤立的软件包,而安装时将显示孤立的软件包,而无需实际执行installor remove。仅供参考。


apt remove -s php7.0-fpm显示The following additional packages will be installed: apache2 apache2-bin apache2-data libapache2-mod-php7.0 libaprutil1-dbd-sqlite3 libaprutil1-ldap liblua5.1-0。如果删除PHP FPM,为什么会安装apache?
Dan Dascalescu

@DanDascalescu嗯。可能对于apt pkg来说是一个错误的安装/删除脚本,或者可能是您有一些其他依赖项将apache2安装为dep(这意味着需要Web服务器-我相信apache2是默认的Web服务器)。可能是几件事。只是不确定。如果您没有找到答案,则在AskUbuntu上有个不错的帖子。
bshea
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.