可以在RPM规范文件中要求“ this or that”软件包吗?


30

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

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

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

Requires: foo-bar OR bar-foo

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

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

更新:我真正需要的是本身在每个软件包中的虚拟软件包。说foo-bar provides eagle' and棒FOO提供小猎犬and my package works with either (or both); but other packages require eitheror小猎犬orFOO杆or扎foo`,目标系统可以具有任一或两个安装。

我目前倾向于使用%pre脚本来解决此问题,例如:

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

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

更新:经过深思熟虑,foo-bar至少在我看来,要求人们将其安装在可能不能安装的地方的痛苦小于绕过RPM依赖管理的痛苦。因此,除非有人提出一种适当地要求“此或那个”的方式(我认为这通常是RPM中的一项很棒的功能),否则我打算 要求它foo-bar,然后在运行时(如果bar-foo可用),我将在他们根据我需要的任何标准。

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

感谢您的建议!


我知道这已经很老了;但是现在有一个好的解决方案吗?我正在制作一个在要求中具有java-1.6.0-openjdk的RPM:但是用java7; 我也想支持java-1.7.0-openjdk,但无法找到一种将这两个条件都放入Requires的好方法:
vpram86

如果您控制bar-foo的包装,则一种可能的解决方案是使用构建它Provides: foo-bar,因此它满足两个依赖关系。对于较新的rpm版本,请检查Boolean Dependencies。远离%pre%post隔离,不要试图破坏系统
forcefsck

Answers:


13

从RPM 4.13开始,这已经成为可能。

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

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


从文档看起来这些不能与require一起使用,只有“弱”依赖项正确吗?
dsollen

第二个链接显示它们可以与Requires一起使用。第一个链接确实提到在Fedora中不允许以这种方式使用它,但这不适用于自定义软件包。
carlwgeorge

9

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

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


谢谢。我认为虚拟软件包不会在这里解决我的特定问题,但我同意它们非常有用。在我的情况下,我不想要求foo-bar和两者提供的一些共同特性bar-foo,而且由于我无法控制它们的包装,foo-bar我不能仅仅使它们都提供support-for-mypackage。如果我控制了两个替代先决条件的打包,那么实际上共享虚拟包将是一个很好的解决方案。
凯文·弗罗斯特

5

两种可能性:

如果部分foo-barbar-foo使用是一种常见的文件,你可以Require /path/to/file(我觉得这样,我的测试是有限的)。

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


不幸的是,没有通用文件。如果存在(尽管也有潜在危险),那将是一个很酷的技巧:将来的某个版本foo-bar可能会移动其文件(我仅bar-foo在此处控制)。可选的依赖关系很有意思,但并不完全符合我的需要,因为我确实需要两种 foo-bar bar-foo ; 唯一可选的是选择哪个。感谢回复。
凯文·弗罗斯特

这解决了我的问题!不同的GNU / Linux版本提供了不同的python3虚拟包:python3,python34,python35等。为了使我的单个包都能在所有这些包上工作,我只能使用Require: /usr/bin/python3
bgStack15'1

0

让您的软件包bar-foo提供虚拟软件包foo-bar对您有用吗?

然后,您可以使burp-baz软件包需要foo-bar。


如果进行上述操作(可能是这样),则可能需要创建两个版本的RPM,一个版本取决于,foo-bar另一个版本取决于bar-foo


诱人,但很危险:foo-bar如果确实认为bar-foo其他东西确实没有提供,那么其他确实需要的东西就会破裂。症结在于,对于我的包裹,我需要先决条件中的任何一个,而不是两者都需要。但任何其他软件包可能真的只需要其中一个。而且我不能只要求两者都使用,因为在实际情况下,只有一个或另一个可用。
凯文·弗罗斯特

-2

自动化系统(依赖管理或使用RPM的机器)中的不确定性确实是一件坏事。您希望它在这种情况下失败,因为失败仍然没有意外结果那么糟糕。

为了解决这个问题,也许让您要控制的程序包%提供不可变程序包也恰好提供并且其他软件所依赖的主要标记;然后让您的软件包过时了。特别是如果它已经安装到位,那么您可能会胜过其他安装。

打包以及适当的依赖性和安装操作是一项棘手的工作。目标-可靠,可重复,可审核的安装-如此有价值,以至于您可能会意识到正确安装的好处。

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


这是我要给你的鱼:您只需要这两个之一,因为两者都提供了一些文件或资源。因此,不要仅依赖于软件包的名称,而不必仅仅依赖于它们提供的文件或资源。是的,您仍然会求助于不确定性,但是如果您实际上正在考虑直接使用rpmdb进行处理,那么您已经在乐于考虑大多数人已经学会避免的风险。希望您能找到不会招致此类技术债务的解决方案。
user2066657
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.