- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
场景:有 3 个 rpm A、B 和 C。
当我们安装 rpm A 时,我们也在安装 rpm B 和 C。所以第一次安装工作正常。当我们在升级过程中安装更新版本的 rpm A 时,我们想删除已安装的 rpm B 和 C由先前的 rpm A.
要求:在安装新的rpm A之前,检查是否安装了B和C。如果是,请卸载 B 和 C。以便新的 rpm A 可以安装新的 rpm B 和 C。
我们尝试了什么:
A 的 spec 文件 %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'
知道为什么我们无法卸载这些 rpm 吗?
编辑: 让我解释一下正确的场景:
这是一个遗留代码,我们正在修复升级过程中发生的问题!
在 puppet 中我们已经提到,如果我们要安装 rpm A,请确保存在 rpm B 和 C。
步骤:
1. 我们将 rpm A、B 和 C 上传到我们的 puppet 服务器。
2. 在我们的 puppet 客户端中运行 puppet agent –t
。
3. 安装所有的rpms
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 中提取文件< br/>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,这样当您要求安装 A
包时,yum 会自动为您处理。
此外,如果您有特定的版本要求,您也可以在 Requires
行中包含这些要求,yum
将为您检查(并强制执行)。
您还可以添加 Conflicts
条目,告诉 yum
这两个包不能同时安装,以及 Obsoletes
条目告诉 yum
这个包替换 另一个包,所以它可以被删除。
正确完成所有操作,yum
会为您处理所有这些。
关于linux - spec 文件中的 rpm -e {rpmName} 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33524028/
场景:有 3 个 rpm A、B 和 C。 当我们安装 rpm A 时,我们也在安装 rpm B 和 C。所以第一次安装工作正常。当我们在升级过程中安装更新版本的 rpm A 时,我们想删除已安装的
我是一名优秀的程序员,十分优秀!