![可以在 RPM 规范文件中要求“这个或那个”包吗?](https://linux22.com/image/557938/%E5%8F%AF%E4%BB%A5%E5%9C%A8%20RPM%20%E8%A7%84%E8%8C%83%E6%96%87%E4%BB%B6%E4%B8%AD%E8%A6%81%E6%B1%82%E2%80%9C%E8%BF%99%E4%B8%AA%E6%88%96%E9%82%A3%E4%B8%AA%E2%80%9D%E5%8C%85%E5%90%97%EF%BC%9F.png)
是否有人知道如何(或是否可以)在规范文件中指定替代要求或一组要求,而不是单一要求?
例如,假设有两个可用的包,分别命名为foo-bar
和bar-foo
。我的包需要其中一个,但不需要两个,而且我不在乎哪个存在。在运行时我会使用可用的那个。
因此,我希望可以这样有效地表达:
Requires: foo-bar OR bar-foo
据我所知这是不可能的,但我认为这里有些人比我更了解 RPM,所以也许有办法做到。
bar-foo
更新:我只控制的包装,而不是的包装foo-bar
,因此让两者都提供虚拟包是行不通的。
更新:我真正需要的东西本身就是虚拟包在每个软件包中。假设foo-bar provides eagle' and
bar-foo 提供了 beagle and my package works with either (or both); but other packages require either
eagle or
beagle 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
在他们可能不会安装的地方安装的痛苦比绕过 RPM 依赖管理的痛苦要小,至少对我来说是这样。因此,除非有人想出一种方法来正确地要求“这个或那个”(我认为这通常是 RPM 的一个很棒的功能),否则我打算要求仅有的 foo-bar
然后,在运行时,如果bar-foo
可用,我将根据我需要的标准在它们之间进行选择。
更新:另一个想法,这也会欺骗 RPM,但可能会让事情进入正确的状态。也许我可以%post
直接摆弄 RPM 的数据库。这样%pre
可以保护我免受无效安装的影响,并%post
会追溯性地告诉 RPM 我需要其中一个foo-bar
或bar-foo
两个,具体取决于我安装时的内容。
感谢您的建议!
答案1
从 RPM 4.13 开始这已经成为可能。
https://rpm-software-management.github.io/rpm/manual/boolean_dependencies.html
它可以简单到如下:Requires: (pkgA >= 3.2 or pkgB)
答案2
这种行为已经被多个软件包实现,例如邮件传输代理。那些虚拟包为您的系统提供一种方法来了解其所需的功能是否已经由其他程序提供。
看看虚拟包rpm.org 中的示例可以帮助您。
答案3
两种可能性:
foo-bar
如果您使用的和部分bar-foo
是通用文件,您可以Require /path/to/file
(我思考所以;我的测试是有限的)。
你的情况类似于可选依赖项。处理它们的方法是有一个X-common
包,然后有一个X-foo-bar
需要的包foo-bar
和一个X-bar-foo
需要的包bar-foo
。
答案4
自动化系统(依赖管理或使用 RPM 的机器)中的非确定性是一件非常糟糕的事情。您希望它在这样或那样的情况下失败,因为失败仍然不如意外结果那么糟糕。
要解决这个问题,也许可以让你控制的包提供不可变包也提供的主要标记,而你的其他软件又依赖这些标记;然后让你的包淘汰不可变包。特别是如果它已经到位,你可能会让它胜过其他安装。
打包和正确的依赖关系以及安装操作是一项棘手的工作。目标 - 可靠、可重复、可审计的安装 - 非常有价值,您可能会意识到正确完成安装的好处。
依赖地狱是自己造成的。没有例外