例如,是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 如何选择要安装的特定包?
APT 不选择包。它说:
如果您尝试手动选择一个包,它将不会被安装。
对于依赖于 awk 的基本文件,它是无关紧要的。首先,它实际上PreDepends on awk,强制 dpkg 在开始安装 base-files 之前安装 awk;其次,mawk 需要优先级,它们是在系统安装时安装的,如果您尝试删除它,它会很容易地唠叨你。所以,不要这样做。
现在,根据消息来源,apt在尝试使用虚拟包之前首先尝试满足依赖关系(即,如果依赖是,则检查是否安装了任何包,如果两者都没有,则尝试安装 firefox)。如果非虚拟包不可用,如果没有其他依赖项被破坏,它似乎只是遍历提供虚拟包的所有包。这种行为的其他评论证据是this导致GrpIterator::FindPreferredPkg function。
firefox | www-browser
如果有提供虚拟包的替代包, Debian 打包政策中没有指定安装哪个特定的真实包。
如果这对于某些包依赖于某些特定的真实包至关重要,那么它应该在
Depends
.但是,如果与一个真实包存在冲突,并且可以安装另一个提供相同虚拟包的包,则将安装一个不冲突的包。
您可以
awk
通过运行检查使用哪个