![APT 如何选择要安装的特定包以提供作为依赖项所需的虚拟包?](https://linux22.com/image/988015/APT%20%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9%E8%A6%81%E5%AE%89%E8%A3%85%E7%9A%84%E7%89%B9%E5%AE%9A%E5%8C%85%E4%BB%A5%E6%8F%90%E4%BE%9B%E4%BD%9C%E4%B8%BA%E4%BE%9D%E8%B5%96%E9%A1%B9%E6%89%80%E9%9C%80%E7%9A%84%E8%99%9A%E6%8B%9F%E5%8C%85%EF%BC%9F.png)
例如,是、和awk
提供的虚拟包。original-awk
mawk
gawk
尝试直接安装会产生以下结果:
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package awk is a virtual package provided by:
original-awk:i386 2012-12-20-4
mawk:i386 1.3.3-17ubuntu2
gawk:i386 1:4.1.1+dfsg-1
original-awk 2012-12-20-4
mawk 1.3.3-17ubuntu2
gawk 1:4.1.1+dfsg-1
You should explicitly select one to install.
E: Package 'awk' has no installation candidate
但是许多虚拟包是默认安装的包的依赖项,例如awk
本身就是 所需要的base-files
,根据 APT 日志检查,它是通过 和一堆其他包一起安装的apt-get --yes
;不知何故,APT 最终会自动选择其中之一(我很确定是mawk
,但这不是问题的重点)。
在这种情况下,APT 如何选择要安装的特定包?
答案1
在这种情况下,APT 如何选择要安装的特定包?
APT 不会选择软件包。它告诉:
你应该明确选择一个安装。
如果您尝试手动选择一个包,它将不会被安装。
对于依赖 awk 的 base-files 来说,这是无关紧要的。首先,它实际上预依赖在awk,强制 dpkg 在开始安装基础文件之前安装 awk;其次,mawk 优先必需的这些程序在系统安装时就已安装,如果您尝试删除它们,apt 会提醒您。所以,不要这么做。
据消息人士透露,apt 目前正在尝试满足依赖关系之前尝试虚拟包(即,如果依赖项为firefox | www-browser
,则检查是否有任何软件包已安装,如果都没有,则尝试安装 Firefox)。如果非虚拟包不可用,它似乎只是迭代所有提供虚拟包的包,如果没有其他依赖项被破坏。此行为的其他评论证据是这这导致GrpIterator::FindPreferredPkg 函数。
答案2
它没有指定Debian 打包政策如果有提供虚拟包的替代包,则安装哪个特定的真实包。
如果这对于某些包依赖某些特定的真实包至关重要,那么应该在 中指定Depends
。
但是,如果与一个真实包存在冲突,并且可以安装另一个提供相同虚拟包的包,那么将安装一个不冲突的包。
你可以awk
通过运行来检查使用了哪个
readlink /etc/alternatives/awk