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/filesofBAnd
C 并从该文件夹中的 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
会为您处理所有这些。
场景:有 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/filesofBAnd
C 并从该文件夹中的 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
会为您处理所有这些。