如何防止 RPM 被视为多库包

How to prevent an RPM from being treated as a multilib package

将 RPM 包中的二进制文件 (.so) 从 32 位更改为 64 位似乎会导致 rpm 将其视为多库包。结果是当使用 "rpm -U" 安装新版本时,旧版本的软件包 而不是 卸载。这对我们来说是个问题,因为在 rpm 升级期间必须删除旧版本的文件。手动卸载旧版本不是一个选项。

我们可以在 rpm 规范文件中使用任何配置来防止 rpm 被视为 multilib 包吗?我们使用 CentOS 7。

我们尝试的一件事是 rpm 规范文件中的 "Obsoletes" 标记,但这并没有导致卸载旧版本。

Conflicts 将强制最终用户删除以前的包。

例如在我的系统上,我有这两个 multilib 包:

$ rpm -q --provides libpcap-1.7.3-1.fc22.i686
libpcap = 14:1.7.3-1.fc22
libpcap(x86-32) = 14:1.7.3-1.fc22
libpcap.so.1
$ rpm -q --provides libpcap
libpcap = 14:1.7.3-1.fc22
libpcap(x86-32) = 14:1.7.3-1.fc22
libpcap.so.1
libpcap = 14:1.7.3-1.fc22
libpcap(x86-64) = 14:1.7.3-1.fc22
libpcap.so.1()(64bit)

我的系统是64位的。所以当我使用:

Obsolete: libpcap

rpm 将尝试淘汰 64 位版本。您必须使用:

Obsolete: libpcap(x86-32)

应该替换那个 32 位版本。 因此,只需查询您的旧包是否提供了 (x86-32) 的内容,然后废弃该包提供的内容。 如果没有这样的规定,您可以分两步进行:

  1. 重建你的旧包,bump release,手动放在那里

    提供:somethig_just_for_upgrade(x86-32)

    然后把这个包放在你的仓库中,这样你的客户就会升级到这个。​​

  2. 放入你的64位包:

    已过时:somethig_just_for_upgrade(x86-32) <= 1.0.0

    因此在下一次升级中,客户将升级到该 64 位版本。