此文为在linux(我只试过debian和Ubuntu)下删除meta-package的一部分包的方法。由于此文过于无趣,所以请未满十八周岁的人士在父母陪同下阅读。
可能很多同学都遇到过这种情况:
新装了linux系统,发现系统自带的有些软件并不合自己的习惯,就想把那个软件卸掉,装自己熟悉的。
比如Y某本人相对于totem,就更喜欢mplayer,相对于evolution就更喜欢sylpheed。
然而真正敲命令去删除的时候
aptitude remove totem
却发现apt告诉你,因为你要删除totem,而gnome依赖于totem,所以apt就要很体贴的帮你删掉整个桌面系统……云云。
在骂娘之前(或者之后也可以),我们可能需要了解一下meta-package,这个词可能对于很多童鞋都很陌生,它是很多linux包管理器(比如apt和pacman)使用的一种虚包(virtual package),它本身可以被看作一种“包的集合”概念,这种包中并不含有任何的程序或者链接库信息,它仅仅是个外壳,依赖于集合中的所有包,具体定义请看这里。
比如,方便面(instant-noodles)包含(依赖)了调料(flavoring)和干面条(dried-noodles),(也许还有libinstant-noodles),当你购买(安装)这个包的时候,系统会自动给你一袋可以马上吃的东西,这自然可以方便包管理,这比你单独去买三样或者更多的材料要方便。
然而,问题是,如果有人很变态的只要面或者只要调料怎么办?绝大多数超市都不会同意你只买一部分。包管理器也一样。于是就出现了最开始出现的那种情况,由于现在empathy/evolution/rhythmbox/totem已经是gnome的核心组件,所以,要不就全装,要不就全卸载……
好了,话费了这么多,有没有解决办法?
有是有,不过:删除meta-package的一部分可能会造成包管理系统的升级或维护错误,威胁到系统稳定性,所以请童鞋们三思而后行……另外这只是针对apt系统和gnome的方法,pacman和KDE之类的同理。
1.最简单(粗暴)的办法:忽略依赖,不用apt,而改用更底层的dpkg
dpkg -r packagename
或者更彻底的:
dpkg -r gnome gnome-core gnome-desktop-environment
(上面那三个都是meta-package,所以其实并没有给系统带来什么影响。)
基本上是一种后患无穷的办法,如果你有觉悟以后都自己手工管理包的话,就去试吧。怜我世人,忧患实多……
2.很无耻但是有用的办法:欺骗apt。
请注意,在各个不同的发行版中,依赖关系是不一样的,运行下面命令之前,建议你自己先运行一遍aptitude/apt-get remove packagename,看看到底牵扯到哪些meta-packages. 之后再照方抓药。
aptitude unmarkauto ‘?reverse-depends(gnome)’
aptitude unmarkauto ‘?reverse-depends(gnome-core)’
aptitude unmarkauto ‘?reverse-depends(gnome-desktop-environment)’之后就可以去随意卸载你想要卸的东西了。
aptitude remove packagename
以上的命令实际上是把gnome/gnome-core等所依赖的包都标记成手动安装(这样apt就不会去纠缠它们的依赖问题),之后apt在执行的时候可能会把那几个meta-pacakge一股脑卸掉。至少你的系统是安全的,以后系统更新也可以照常做。不过,也很难说会不会有什么不良影响,总之,再说一遍:三思而后行。