Apt

APT&Yum

Debian系和Redhat系的包管理工具对照。

Install-Recommends

Aptitude默认的依赖是自动安装“推荐”的包,这个可以在选项里面去掉。如何找到这些被自动安装的推荐包呢?Aptitude提供了强大的搜索功能,可以在Aptitude的界面按下'l',即Limited View,然后输入

?reverse-recommends(.*) ?automatic !?reverse-depends(.*)

或者用命令行:

aptitude search --disable-columns '?reverse-recommends(.*) ?automatic !?reverse-depends(.*)'

即可匹配被所有包推荐、自动安装,同时又不被任何包依赖的包。[1]

这样我电脑上共有55个这种包,本来是打算找到后都删除的,但是看了看,有些还是用到的,比如indicator-applet-complete、gwibber-service-twitter等,就不删除了,而且也保持Aptitude的默认安装推荐包的选项。

不过Aptitude的这个功能有点问题,设置了之后不但手动安装的包推荐包要安装,连手动安装的包的依赖包的推荐包(当然也包括依赖包)也要安装。就是说如果M依赖D,D又推荐R,那么不但D会自动安装,R也会自动安装。再比如我安装shutter,shutter依赖libgnome2-vfs-perl,而libgnome2-vfs-perl推荐libgnomevfs2-extra,那么libgnomevfs2-extra也会被自动安装,这样的话安装的未免太多了(可以作为Bug提交)。如果手动把它去掉,并不会破坏依赖关系。不过没有研究推荐包的推荐包是否也会自动安装,不应当这么做的。

配置

所有的配置选项在file:///usr/share/doc/apt/examples/configure-index.gz

绘图

可以用apt-cache的dotty选项把包的依赖关系输出为Graphviz的dot命令的输入。但是默认情况,除了depends和predepends,经过研究,连conflicts都递归地输出(其它的依赖类型没有确认),这样输出非常大,绘图根本不现实,比如把输出限制在命令行给出的包,例如:

apt-cache dotty -o APT::Cache::GivenOnly=true vim-gnome | dot -T png | display

dotty命令似乎并不理睬apt-cache的--no-pre-depends, --no-depends, --no-recommends, --no-suggests, --no-conflicts, --no-breaks, --no-replaces, --no-enhances等选项,这些选项只对depens和rdepends命令有效。

如果-o后面的选项敲错,成不存在的选项,apt直接忽略,按照默认处理,所以这也所一个BUG了。上面的命令生成如下的图片:

apt-cache的dotty命令很不实用。如果不加APT::Cache::GivenOnly=true选项,输出太多;加上了,输出又太少。

有一个叫apt-rdepends的第三方的工具,就可以很好地解决上面的问题。因为它默认递归输出,而且只考虑depends和predepends,可样既可递归,又不至于递归到软件包数量巨大:

apt-rdepends --dotty vim | dot -T png | display

输出结果如下图:

其实,apt-rdepends是为了recursive reverse depends而出现的[2],即给出指定包被哪些包依赖。也许那时候apt-cache没有这个功能,现在的--recurse也可用在rdepends命令了。

apt-rdepends的--follow选项,在手册中说的参数实际是无效的,要用数字参数[3],要注意--follow和--show各自的效果。例如:

apt-rdepends -f 3,4 -s 3,4 gedit -d | dot -T png | display

则递归地输出gedit的建议包和推荐包(数字选项的编号参看AptPkg(3pm)中的pkgCache::Dep::DepType[4]):

参考

  1. file:///usr/share/doc/aptitude/README

  2. file:///usr/share/doc/apt-rdepends/README

  3. https://bugs.launchpad.net/debian/+source/apt-rdepends/+bug/315567

  4. AptPkg(3pm)