[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Apt-get autoremove 与 aptitude remove 两者行为是否有区别?



2010/6/22 chenwqin@gmail.com <chenwqin@gmail.com>
>
> 以下图中,
> 绿色圆是为了满足依赖关系而apt-get或aptitude自动安装上的 包
> 蓝色圆是管理员使用apt-get install 或 aptitude install指定安装的包,简称为手动安装的 包

其实你没必要搞这么复杂 而且邮件列表的指导原则是采用纯文本格式撰写
这些图片对后续的讨论和邮件的存档 (包括 usenet 和 google groups 中的阅读) 非常不友好

> 例子 1:

[snip]

> 例子3:
> 1. 在例子2的基础上, 有个手动安装的包E推荐D(既E Recommends D,手动安装E时,也会把D装上)
>
> apt-get remove C : 将删除C, 同时提示你用apt-get autoremove去清除B,D
> apt-get autoremove C : 将删除B, C, D
> aptitude remove C : 将删除B, C, D

我前面的疑惑就是针对你的最后一句话 也就是这个情况

从 /var/lib/apt/extended_states 可以看出 只有自动安装状态是被记录的 具体的依赖与推荐关系并不被记录
(可以通过 aptitude why $pkg 来查找指定包的可能安装原因)

依照你此例中说明的情况 执行

$ apt-get autoremove

会卸载所有只被某些包推荐而不被任何包依赖的包 而这明显与事实不符

我希望你给出具体的例子 也就是具体的 package names 而不是这些的并没有让问题变得更明了的示意图 这些图片中的依赖与推荐关系用文字也可以表述的很清楚

> 我的理解: 删除C, 那么B,D 这两个包既是自动安装的,且没有其他手动安装的包依赖于它们,
> 则可以判定B,D也是没必要的
> 虽然D被E Recommend, 但为啥是这么设计的, 我没猜出开发人员的想法

因为本身并不成立
你说的这种卸载方式 以 apt 对包依赖的记录 是无法实现的

> 例子4:

[snip]

> 例子5:
> 1. 在例子4的基础上, D变成推荐B, E依然依赖于D
>
> apt-get remove C : 将删除C, 同时提示你用apt-get autoremove去清除B
> apt-get autoremove C : 将删除B, C
> aptitude remove C :将删除B, C
>
> 我的理解: 删除C, 而B没有被其他手动安装的包直接依赖或者间接依赖(我指那些一层层depend on的关系), D被E依赖
> 所以B不是必要的,可以删除, 而D不能删除

这个例子里也有同样的问题

一个比较合理的判断一个包是否会被自动卸载的方法是用 aptitude why $pkg

只要 aptitude why $pkg 能够找到任何一条路径使得 $pkg 是被某些包依赖或推荐的 则 apt-get
autoremove 和 aptitude remove 就不会卸载 $pkg

如果你不同意的话 希望能举出真实反例


> Tao
> --
> http://huangtao.me/
> http://www.google.com/profiles/UniIsland
>

Reply to: