如何使用apt-get排除特定软件包的安装?

我想在安装时使用apt-get排除特定的软件包,也就是说,安装一个元软件包而不包含特定软件包的列表,最好只需一次apt-get调用。
例如,在Ubuntu 14.04 LTS命令行中,我正在安装MATE桌面环境。在14.04 LTS中,MATE不是官方版本,所以我要添加一个PPA:
sudo apt-get install software-properties-common # need them for 'apt-add-repository'
sudo apt-add-repository ppa:ubuntu-mate-dev/ppa
sudo apt-add-repository ppa:ubuntu-mate-dev/trusty-mate
sudo apt-get update

然后安装:
sudo apt-get install xorg mate-core --no-install-recommends

即使没有推荐的附加组件,mate-core也会安装3个终端仿真器:xtermuxtermmate-terminal,后者在这种最小配置下安装时缺少适当的字体。 假设我决定3个终端程序太多了,我想要安装xorgmate-core,但不包括xtermmate-terminal。我可以这样做:
sudo apt-get install xorg mate-core --no-install-recommends
sudo apt-get purge xterm mate-terminal

但是能一次性完成这个吗?有没有类似的语法呢?
sudo apt-get install xorg mate-core --without xterm mate-terminal

你确定可以移除 xtermmate-terminal 吗?在 15.04 版本中,mate-terminalmate-desktop-environment-core 的硬依赖项,而 mate-desktop-environment-core 又是 mate-core 的硬依赖项。我猜想 PPA 中的 mate-terminal 并不提供 x-terminal-emulator(这是 15.04 版本中的包所具备的)。 - muru
也许你是对的,除非在软件包名称旁边的星号表示了一些特殊意义。而且,出人意料的是要释放的空间很少。无论如何,我的问题是关于移除任何可以移除的东西,比如 XTerm 和可能的 UXTerm(我不确定后者的软件包名称是什么)。 - Nickolai Leschov
2这是你在找的吗?http://askubuntu.com/questions/75895/how-to-forbid-a-specific-package-to-be-installed - Seth
@Seth 不完全正确:我希望有一些类似于 sudo apt-get install xorg mate-core --without xterm mate-terminal 的语法。 - Nickolai Leschov
如果你使用aptitude(或者一些图形化的软件包管理器),你可以选择(取消选择)要安装的软件包,如果其中一个导致了依赖关系错误,通常会给出解释。 - saiarcot895
4个回答

所以,mate-core依赖于mate-desktop-environment-core,而后者又依赖于mate-terminal。这种依赖关系不容易打破。无论是apt-get还是aptitude都不支持--without--exclude选项,并且“保持”软件包也无济于事:
$ echo "mate-terminal hold" | sudo dpkg --set-selections
$ sudo apt-get install mate-core
[...]
无法安装某些软件包...
以下软件包有未满足的依赖关系:

当然,可以使用dpkg --force-depends来安装一个软件包,但这可能不是你想要的。

一种可能的解决方法是用一个虚拟软件包来满足Depends:标志:

现在应该能够安装mate-core而不需要mate-terminal。对于其他要排除的软件包,重复相同的步骤。
诚然,这是一项相当费力的工作,如果有一个--without选项会很好。也许可以提出一个wishlist bug来在将来提供这样的功能,但我对此是否会被实现表示怀疑。
然而,一个更现实的选择是向PPA所有者请愿,为MATE提供另一个具有较少Depends软件包设置的元包。

这种情况下有一个特殊的apt语法:在包名后添加一个连字符(减号)将删除/不安装该包,所以最接近你的sudo apt-get install xorg mate-core --without xterm mate-terminal的命令是sudo apt-get install xorg mate-core xterm- mate-terminal-(见https://askubuntu.com/a/1011439/182923)。
在这种情况下它不会起作用,因为你会遇到问题。
The following packages have unmet dependencies:
 mate-desktop-environment-core : Depends: mate-terminal (>= 1.20) but it is not going to be installed                                                                        
E: Unable to correct problems, you have held broken packages.

但这似乎是对你具体问题的答案。所以供参考,这是转贴的内容。

如果您使用aptitude或图形化软件包管理器(如Synaptic等),那么只要不会引起依赖问题,您可以取消选择要安装的软件包。
对于aptitude来说,在安装软件包之前(在图形界面中),它会显示为什么要安装一个依赖软件包。在我的情况下,我使用KDE,因此没有任何MATE软件包。如果我告诉它安装mate-core,我会得到以下结果:

enter image description here

请注意,mate-core 被标记为手动安装,并且正在安装许多其他软件包。对于 mate-terminal 软件包,在底部显示 "mate-desktop-environment-core [universe] 依赖于 mate-terminal (>= 1.0.0)"。继续查看 mate-desktop-environment-core 的条目,

enter image description here

"

mate-core [宇宙] 依赖于 mate-desktop-environment-core(>=1.8.0+9)”。这就是为什么正在安装mate-terminal

如果正在安装的是建议的软件包(而不是依赖于其他软件包的软件包),aptitude会告诉你,并且你可以告诉它不要安装那个软件包,而没有任何损坏的依赖关系。例如:

"

enter image description here


另一种方法
下载依赖于其他软件包的主要软件包。解压缩软件包,删除不需要的依赖项,重新打包。现在使用gdebi软件包安装程序打开新的软件包。它将为您安装新的依赖项。
依赖项列表可以在DEBIAN/control -> depends中找到。
有关替换deb文件的帮助,请参阅我的回答“如何创建PPA”。