我需要用自定义包替换一个包,该包有自己的名称 (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”。