可以在 RPM 规范文件中要求“这个或那个”包吗?

Kev*_*ost 33 rpm

有谁知道如何(或是否可以)在规范文件中指定替代需求或一组需求,而不是单个需求?

例如,假设有两个包可用,方便地命名为foo-barbar-foo. 我的包裹需要其中之一,但不是两者都需要,而且我不在乎存在哪一个。在运行时,我使用任何可用的。

如此有效,我想用一种方式说:

Requires: foo-bar OR bar-foo
Run Code Online (Sandbox Code Playgroud)

据我所知这是不可能的,但我认为这里有人比我更了解 RPM,所以也许有办法做到这一点。

更新:我只控制bar-foo,而不是的包装foo-bar,因此两者都提供虚拟包将不起作用。

更新:我真正需要的是每个内的虚拟包。假设foo-bar provides eagle' andbar-foo 提供了 beagle and my package works with either (or both); but other packages require eithereagle orbeagle orfoo-bar orbar-foo`,目标系统可以安装其中一个或两个。

我目前倾向于使用执行以下操作的%pre脚本来解决此问题:

rpm -q eagle || rpm -q beagle || echo "need eagle or beagle" && /bin/false
Run Code Online (Sandbox Code Playgroud)

虽然我很确定这会起作用,但它似乎是对 RPM 依赖项跟踪的残酷规避。例如,当您询问whatrequires foo-bar或时,您永远不会看到我的包裹whatrequires beagle

更新:再想一想,foo-bar至少在我的情况下,要求人们在他们可能无法安装的地方安装的痛苦比绕过 RPM 依赖管理的痛苦要少。因此,除非有人想出一种方法来正确地要求“这个或那个”(我认为这通常是 RPM 中的一个很好的功能),否则我计划 要求foo-bar,然后在运行时,如果bar-foo可用,我将在两者之间进行选择他们根据我需要的任何标准。

更新:另一个想法,这也会欺骗 RPM,但可能会使事情进入正确的状态。也许我可以,在%post,直接摆弄 RPM 的数据库。因此%pre可以保护我免受无效的安装,并%post会追溯告诉RPM,我要求或者foo-bar或者bar-foo或者两者,取决于那里的东西,当我安装。

感谢您的建议!

小智 14

从 RPM 4.13 开始,这现在是可能的。

https://rpm.org/user_doc/boolean_dependencies.html

它可以很简单: Requires: (pkgA >= 3.2 or pkgB)


Jan*_*nen 9

这种行为已经由几个包完成,例如邮件传输代理。这些虚拟包为您的系统提供了一种方法来了解其他程序是否已经提供了它们所需的功能。

看看rpm.org 中的虚拟包示例是否对您有帮助。


Mar*_*ner 5

两种可能:

如果你使用的部分foo-barbar-foo你使用的是一个公共文件,你可以Require /path/to/file(我认为是这样;我的测试是有限的)。

您的情况类似于可选依赖项。它们的处理方式是先有一个X-common包,然后有一个X-foo-bar需要foo-barX-bar-foo包和一个需要bar-foo.