有没有人知道如何(或者是否可以)在一个spec文件中指定一个替代的需求或一组需求,而不是一个单一的需求?
例如,假设有两个软件包,方便地命名为foo-bar
和bar-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 either
鹰or
小猎犬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-bar
或bar-foo
或者两者兼有,这取决于我在安装时的内容。
感谢您的build议!
这种行为已经由几个软件包完成,例如邮件传输代理。 这些虚拟软件包为您的系统提供了一种方法来知道他们需要的function是否已经由其他程序提供。
看看在rpm.org中的虚拟包示例是否有帮助。
两种可能性:
如果你使用的foo-bar
和bar-foo
的部分是一个普通的文件,你可以只Require /path/to/file
(我认为是这样,我的testing是有限的)。
你的情况类似于可选的依赖关系。 他们处理的方式是有一个X-common
包,然后有一个X-foo-bar
包需要foo-bar
和一个需要bar-foo
的X-bar-foo
包。
它会为你工作,让你的软件包bar-foo提供虚拟软件包foo-bar吗?
然后你可以让你的打包包需要foo-bar。
如果上面这样做会让人觉得不舒服(可能是),你可能需要创build两个版本的RPM,一个取决于foo-bar
,另一个取决于bar-foo
。
自动化系统(依赖pipe理或使用RPM的机器)中的非确定性是一件非常糟糕的事情。 你们希望它能够在这种或那种情况下失败,因为失败还不如意外的结果。
为了解决这个问题,也许让你控制的程序包提供了主要的令牌,即不可变的程序包也会碰到%提供的以及你的其他软件所依赖的程序。 然后让你的包%废除不可变的。 特别是如果它已经到位,你可能会得到它胜过其他安装。
打包和适当的依赖和安装操作是棘手的工作。 目标 – 可靠,可重复,可审计的安装 – 非常有价值,您可能会意识到获得正确的收益。
依赖地狱是自我造成的。 没有例外