APT 如何选择要安装的特定包以提供作为依赖项所需的虚拟包?

APT 如何选择要安装的特定包以提供作为依赖项所需的虚拟包?

例如,是、和awk提供的虚拟包。original-awkmawkgawk

尝试直接安装会产生以下结果:

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

相关内容