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

我需要用一个自定义名称replace一个(foo-origpackage)。 为了允许它被用作插入replace,我在控制文件中添加了Provides: origpackage行。 apt-cache show foo-origpackage列出了“提供”条目。 但是,当我想根据origpackage安装一个文件时,它会失败(“Package origpackage not installed”)。

是否有一些“真实”和我虚拟的虚拟包之间的区别?

编辑:

准确地说,我想要replace的是xen-utils-common for Squeeze。 我的tao-xen-utils-common有以下control文件:

 来源:tao-xen-utils-common
部分:内核
优先级:可选
维护者:Creshal <[email protected]>
build立 - 取决于:debhelper
标准版本:3.8.0
主页:http://tao.at

包:tao-xen-utils-common
build筑:所有
取决于:gawk,lsb-base,udev,xenstore-utils,tao-firewall
提供:xen-utils-common
冲突:xen-utils-common
取代:xen-utils-common
说明:Xenpipe理工具 - 通用文件(已修改)
 用户空间工具来pipe理通过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


反向取决于: 
  道防火墙,陶Xen的utils的常见
  道防火墙,陶Xen的utils的常见
依赖关系: 
 4.0.0-1tao1-gawk(0(null))lsb-base(0(null))udev(0(null))xenstore-utils(0(null))tao-firewall(0(null))xen-utils -common(0(null))xen-utils-common(0(null)) 
规定: 
 4.0.0-1tao1  -  xen-utils-common 
反向提供: 


 foo @ bar#apt-get install xen-utils-4.0
正在读取软件包列表...完成
build立依赖关系树       
阅读状态信息...完成
以下额外的软件包将被安装:
   Xen的utils的常见
build议套餐:
   Xen的文档 -  4.0
以下软件包将被删除:
  陶Xen的utils的常见
以下新软件包将被安装:
   xen-utils-4.0 xen-utils-common 

编辑:

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

我花了相当一段时间调查这个相同的问题,我得出的结论是“提供”被忽略,因为xen-utils-4.0版本的“取决于”xen-utils-common。

引用Debian政策手册 :

“提供”字段可能不包含版本号,提供特定虚拟包的具体包的版本号在考虑对虚拟包名称的依赖或冲突时将不被考虑。

如果Depends是未版本化的,则提供将会被满足,然而一个总是未版本化的提供永远不能满足版本化的Depends。

不幸的是,除了您已经提出的build议外,我没有解决scheme:保持相同的软件包名称和更高的版本号。

在@ cavedon的答案中引用的“Debian策略手册”部分仍然保持不变,但是已经过时。 由于dpkg 1.17.11可以在提供的软件包上设置版本。 从更新日志 :

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

所以要解决原来的例子,在控制文件中添加一行

Version: *version*

(用实际版本replace*版本)并replace该行

Provides: xen-utils-common

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

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

有点工作,但我打开更好的解决scheme。

“提供”仅适用于虚拟包。 如果你想replace一个真正的软件包,你需要使用“replace”,如果软件包提供相同的文件,也可能使用“冲突”。

参见Debian Policy,第7章 。