DEB:“提供:”字段被忽略

DEB:“提供:”字段被忽略

我需要用自定义包替换一个包,该包有自己的名称 (foo-origpackage)。为了允许将其用作直接替换,我Provides: origpackage在控制文件中添加了以下行。apt-cache show foo-origpackage列出“提供”条目很好。但是,当我想安装依赖于 origpackage 的文件时,它会失败(“未安装 origpackage 包”)。

我是否忽略了“真实”包和虚拟包之间的区别?

编辑:

准确的说,我要替换的是 Squeeze 的 xen-utils-common。我的 tao-xen-utils-common 有以下control文件:

来源:tao-xen-utils-common
部分:内核
优先级:可选
维护者:Creshal <[电子邮件保护]>
构建依赖:debhelper
标准版本:3.8.0
主页:http://tao.at

软件包:tao-xen-utils-common
建筑:全部
依赖:gawk、lsb-base、udev、xenstore-utils、tao-firewall
提供:xen-utils-common
冲突:xen-utils-common
替代:xen-utils-common
描述:Xen 管理工具 - 公用文件(已修改)
 用于管理通过 Xen 虚拟化的系统的用户空间工具
 機器監視器。
 经过修改以用于 TAO 防火墙。

但是安装 xen-utils-4.0 失败:

foo@bar# apt-cache showpkg tao-xen-utils-common
软件包:tao-xen-utils-common
版本:
4.0.0-1tao1(/var/lib/apt/lists/repo.tao.at_dists_stable_main_binary-amd64_Packages)(/var/lib/dpkg/status)
 描述语言:
                 文件:/var/lib/apt/lists/repo.tao.at_dists_stable_main_binary-amd64_Packages
                  MD5:7c2503f563fca13b33b4eb3cbcb3c129


反向依赖:
  tao-防火墙,tao-xen-utils-common
  tao-防火墙,tao-xen-utils-common
依赖项:
4.0.0-1tao1 - gawk (0 (空)) lsb-base (0 (空)) udev (0 (空)) xenstore-utils (0 (空)) tao-firewall (0 (空)) xen-utils-common (0 (空)) xen-utils-common (0 (空))
提供:
4.0.0-1tao1 - xen-utils-common
反向提供:


foo@bar# apt-get 安装 xen-utils-4.0
正在读取软件包列表...完成
构建依赖关系树       
正在读取状态信息...完成
将会安装以下额外的软件包:
  xen-utils-通用
建议的软件包:
  xen-文档-4.0
下列软件包将被删除:
  tao-xen-utils-通用
将会安装以下新软件包:
  xen-utils-4.0 xen-utils-通用

编辑:

foo@bar# apt-cache 策略 xen-utils-4.0
xen-utils-4.0:
  已安装:(无)
  候选:4.0.1-4
  版本表:
     4.0.1-4 0
        500http://ftp.at.debian.org/debian/stable/main amd64 软件包
     4.0.1-4 0
        500http://security.debian.org/stable/updates/main amd64 软件包

答案1

我花了相当多的时间调查同样的问题,并得出结论,“提供”被忽略是因为 xen-utils-4.0 有一个依赖于 xen-utils-common 的版本。

引用Debian 政策手册

Provides 字段可能不包含版本号,并且在考虑与虚拟包名称的依赖关系或冲突时,不会考虑提供特定虚拟包的具体包的版本号。

如果依赖项未受版本控制,则提供项将会得到满足,但是始终未受版本控制的提供项永远无法满足受版本控制的依赖项。

不幸的是,除了您已经提出的解决方案之外,我没有其他解决方案:保留相同的软件包名称并使用更高的版本号。

答案2

Debian 政策手册中引用的部分@cavedon 的回答仍未更改,但已过时。从 dpkg 1.17.11 开始,可以对提供的软件包设置版本。从变更日志

  • 添加版本提供支持:
    • 添加新的 dpkg --assert-versioned-provides 命令。
    • 软件包可以提供一个特定的版本“virtual (= 1.0)”,它将被尊重,以前它只会在解析时被接受。
    • 非版本化虚拟包将无法满足版本化依赖关系。
    • 版本化虚拟包将满足非版本化依赖项。基于 Ben Collins 的骨架代码。关闭:#7330、#24934、#112131、#134582、#180316

因此,为了解决原始示例,请在控制文件中添加一行

Version: *version*

(将 *version* 替换为实际版本)并替换以下行

Provides: xen-utils-common

Provides: xen-utils-common (= ${binary:Version})

答案3

最终通过将其重命名为 xen-utils-common 并添加自定义版本,并使需要自定义的软件包与更高版本冲突,从而缓解了问题。因此,xen-utils-common 的更新被阻止,直到我更新了这两个软件包。

有点用,但我愿意接受更好的解决方案。

答案4

“Provides” 仅适用于虚拟包。如果要替换真实包,则需要使用“Replaces”,如果包提供相同的文件,可能还需要使用“Conflicts”。

Debian 政策,第 7 章

相关内容