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

有没有人知道如何(或者是否可以)在一个spec文件中指定一个替代的需求或一组需求,而不是一个单一的需求?

例如,假设有两个软件包,方便地命名为foo-barbar-foo 。 我的包需要其中一个,但不是两个,我不在乎哪一个在场。 在运行时我使用可用的。

所以我想有一个方法来说:

 Requires: foo-bar OR bar-foo 

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

更新:我只控制bar-foo的包装,而不是foo-bar ,所以既提供虚拟包也不行。

更新:我实际上需要的东西本身就是一个虚拟包内的每个包。 说foo-bar provides eagle' and bar-foo提供比格犬and my package works with either (or both); but other packages require either and my package works with either (or both); but other packages require eitheror小猎犬or foo-bar or bar-foo`,目标系统可以安装其中之一或两者。

我目前正倾向于用%pre脚本来解决这个问题,

 rpm -q eagle || rpm -q beagle || echo "need eagle or beagle" && /bin/false 

虽然我非常肯定这会起作用,但它似乎是对RPM的依赖性跟踪的一种残酷的规避。 例如,当你问whatrequires foo-bar或什么是whatrequires beagle时,你永远都看不到我的包装。

更新:在第二个想法,要求人们安装foo-bar的痛苦,至less对于我的情况来说,要less于规避RPM依赖pipe理的痛苦。 所以,除非有人想出一种方法来正确地要求“这个或那个”(我认为这将是一个非常好的function),那么我打算需要foo-bar ,然后在运行时,如果bar-foo是可用的我会根据我需要的任何标准之间进行select。

更新:另一个想法,这也会欺骗RPM,但可能会使事情进入正确的状态。 也许我可以在%post直接摆弄RPM的数据库。 因此, %pre可以保护我免受无效安装的影响,而%post会追溯地告诉RPM我需要foo-barbar-foo或者两者兼有,这取决于我在安装时的内容。

感谢您的build议!

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

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

两种可能性:

如果你使用的foo-barbar-foo的部分是一个普通的文件,你可以只Require /path/to/file (我认为是这样,我的testing是有限的)。

你的情况类似于可选的依赖关系。 他们处理的方式是有一个X-common包,然后有一个X-foo-bar包需要foo-bar和一个需要bar-fooX-bar-foo包。

它会为你工作,让你的软件包bar-foo提供虚拟软件包foo-bar吗?

然后你可以让你的打包包需要foo-bar。


如果上面这样做会让人觉得不舒服(可能是),你可能需要创build两个版本的RPM,一个取决于foo-bar ,另一个取决于bar-foo

自动化系统(依赖pipe理或使用RPM的机器)中的非确定性是一件非常糟糕的事情。 你们希望它能够在这种或那种情况下失败,因为失败还不如意外的结果。

为了解决这个问题,也许让你控制的程序包提供了主要的令牌,即不可变的程序包也会碰到%提供的以及你的其他软件所依赖的程序。 然后让你的包%废除不可变的。 特别是如果它已经到位,你可能会得到它胜过其他安装。

打包和适当的依赖和安装操作是棘手的工作。 目标 – 可靠,可重复,可审计的安装 – 非常有价值,您可能会意识到获得正确的收益。

依赖地狱是自我造成的。 没有例外