spec 文件中的 rpm -e {rpmName} 不起作用

rpm -e {rpmName} in spec file isn't working

场景:有 3 个 rpm A、B 和 C。

当我们安装 rpm A 时,我们正在安装 rpm B 和 C,因为 well.So 第一次安装正常 fine.When 我们安装了更新版本的 rpm A,在升级过程中我们想删除 rpm之前rpm A安装的B和C.

要求:在安装新的 rpm A 之前,检查是否安装了 B 和 C。如果是卸载 B 和 C.So 新的 rpm A 可以安装新的 rpm B 和 C.

我们尝试了什么:

A 的规范文件 %pre 部分:

%pre
if rpm -qa | grep B; then
rpm -e B;
fi
if rpm -qa | grep C; then
rpm -e C;
fi

我们正在使用木偶。当我们 运行 puppet agent -t --debug 时,在安装 rpm A 之前它会在下面的行挂起!

Debug: Executing '/usr/bin/yum -d 0 -e 0 -y install A'

知道为什么我们无法卸载这些 rpms 吗?

编辑: 让我解释一下正确的场景:

这是遗留代码,我们正在修复升级过程中发生的问题!

我们在 puppet 中提到,如果我们要安装 rpm A,请确保存在 rpm B 和 C。

步骤:
1. 我们将 rpm A、B 和 C 上传到我们的 puppet 服务器。
2. 运行 puppet agent –t 在我们的人偶客户端中。
3. 安装所有的 rpm
4. Rpm A 的 .spec 文件:在 %pre 部分,他们正在做 rm –rf /m/n/current,在 %install 部分,他们正在做 mkdir /m/n 并在此文件夹中提取 rpm A 的内容。
5. Rpm B 的 .spec 文件:在 %install 部分,他们正在做 mkdir /m/n/current/filesofBAndC 并从 rpm B 中提取一个文件到这个文件夹中
6. Rpm C 的 .spec 文件:在 %install 部分,他们正在执行 mkdir /m/n/current/filesofBAndC 并从该文件夹中的 rpm C 提取文件
7. 以下场景一切正常
• 首次安装
• 卸载 rpm A 并安装更新版本的 A(仅全新安装)
• 升级A(B和C有版本变化)
8. 问题是,如果我们安装更新版本的 A(无需卸载以前版本的 A)而 rpm B 和 C 没有任何版本更改,它只会安装 rpm A(因为 rpm B 和 C 没有版本更改) .在 rpm A 安装过程中,我们正在删除文件夹 /m/n/current,这意味着我们的 /m/n/current/filesofBAndC 也将被删除。
删除 BAndC 文件夹文件会产生问题。因此,如果我们在安装 rpm A 之前卸载 rpm B 和 C,puppet 将在安装 rpm A 期间再次安装这些 rpm,并且 /m/n/current/filesofBAndC 将使用所需的文件再次创建。

由于某些依赖关系,我们不应修改文件夹结构(如 /m/n/filesofBAndC)。

因为这不是您应该做的,而且 yum 是事务性的,数据库可能在安装过​​程中被锁定。

你这样做的方法是在 A 包的 .spec 文件的 Requires: 行列出 B 和 C RPM,以便 yum 处理这个 当你要求它安装 A 包时自动 为你。

此外,如果您有特定的版本要求,您也可以在 Requires 行中包含这些要求,yum 将为您检查(并强制执行)。

您还可以添加 Conflicts 条目告诉 yum 这两个软件包不能同时安装,以及 Obsoletes 条目告诉 yum此软件包 替换了 另一个软件包,因此可以将其删除。

正确完成所有这些,yum 会为您处理所有这些。