【问题标题】:RPM spec decide which dependency installs firstRPM 规范决定首先安装哪个依赖项
【发布时间】:2021-02-02 02:40:52
【问题描述】:

我正在尝试创建一个 RPM (my-main-rpm),它有 10 多个依赖项(其中大部分不是我制作的),但我想先安装另一个我创建的 RPM (my-rpm-prerequisite)。这个my-rpm-prerequisite RPM 创建/修改了一些需要在安装其他依赖项之前完成的文件。

我希望能够使用单个命令安装整个 rpm:dnf/yum/zypper install my-main-rpm,它应该安装所有依赖项。但我希望该命令首先安装my-rpm-prerequisite

有什么办法可以做到吗?

或者有什么方法可以在安装依赖项之前执行脚本?

【问题讨论】:

  • 您可以使用Requires(pre) 进行订购,但前提是它们是您自己的 RPM。如果您没有将它们全部打包,则不能说“在perl之前安装我”或类似的话;这只是一个免费的。
  • 这违背了 RPM 的编写方式,这就是为什么没有真正简单的方法来做到这一点。事务是准原子的;所有承诺的文件/RPM 将在最后出现。你的最终目标是什么?什么是 prereq RPM 如此重要以至于它可能会影响不属于您的 RPM,但其重要性不足以放入 Kickstart / Puppet / 等?

标签: rpm yum rpmbuild rpm-spec zypper


【解决方案1】:

这是不可能的。 rpm 依赖系统只是确保安装每个包的依赖关系,但不确保安装顺序。在您运行 my-main-rpm 的安装之前,您的依赖项可能已经存在于系统上。在这种情况下,不可能在安装依赖项之前运行脚本,因为它们已经安装。

我认为你可以影响安装顺序的唯一方法是设置依赖项,但你只能在你自己创建的包上这样做:

  • 如果 A 依赖于 B 而 B 依赖于 C,那么它们将按照 C -> B -> A 的顺序安装。
  • 如果A依赖B和C,那么B和C会在A之前安装,但是不能保证顺序;它可以是 C -> B -> A,也可以是 B -> C -> A。

【讨论】:

  • 我会支持这个答案。如果存在依赖循环,那么 DNF 可以在任何地方切断该循环。在这种情况下,您的依赖项甚至可以安装在主包之后。但是...(我会将此作为答案发布)。
【解决方案2】:

正如克里斯所说,使用Requires 是不可能实现的。但是如果你“只”想执行一些脚本,还有其他方法。

首先,您可以在my-rpm-prerequisite.spec中指定:

Supplements: rpm-prerequisite

这种方式默认安装将安装 my-rpm-prerequisite 作为 rpm-prerequisite 的增强。

其次,您指定%pretrans 脚本。它在事务开始时运行。见https://docs.fedoraproject.org/en-US/packaging-guidelines/Scriptlets/#pretrans

但请注意,即使在安装基本系统时也可能会执行 %pretrans。所以系统(或chroot)上没有安装任何东西。所以应该是用Lua写的,由rpm自己解释。

【讨论】:

  • 很好的 hack,但是当你需要解决这种方法时,你就陷入了危险的境地
猜你喜欢
  • 2010-10-26
  • 1970-01-01
  • 2021-05-01
  • 2019-07-01
  • 1970-01-01
  • 2018-12-04
  • 2012-01-26
  • 2015-10-14
  • 2012-12-02
相关资源
最近更新 更多