如何在 rpm scriptlet 中获取要卸载的版本?

如何在 rpm scriptlet 中获取要卸载的版本?

我有以下场景:

  1. 我安装了软件包的版本 1,它在安装后执行自定义操作(将一些文件复制到某个位置)
  2. 我安装了同一软件包的版本 2
  3. 我想卸载版本 1。为了能够进行清理,我需要在卸载后知道确切的版本,以清理复制的文件。

有没有办法获取 rpm scriptlet 中的版本号?

答案1

%从文件的相关版本调用脚本rpm。因此,如果您从版本 1.0 升级到 1.1,则预/后安装脚本将从 1.1 版本的 rpm 运行,预/后卸载脚本将从 1.0 版本运行。

这使得脚本很容易正确处理自己的版本。

例如,以下是 SPEC 文件的摘录

%pre
echo Pre called with version %{version}-%{release}

%post
echo Post called with version %{version}-%{release}

%preun
echo Pre-un called with version %{version}-%{release}

%postun
echo Post-un called with version %{version}-%{release}

它们非常简单,只是为了演示这一点。当您构建 rpm 时,这些值将嵌入到 rpm 中

例如

% rpm -q --scripts -p sweh-test-1.0-0.x86_64.rpm 
preinstall scriptlet (using /bin/sh):
echo Pre called with version 1.0-0
postinstall scriptlet (using /bin/sh):
echo Post called with version 1.0-0
preuninstall scriptlet (using /bin/sh):
echo Pre-un called with version 1.0-0
postuninstall scriptlet (using /bin/sh):
echo Post-un called with version 1.0-0

现在让我们安装这个包的 1.0.0 版本:

% sudo rpm -i sweh-test-1.0-0.x86_64.rpm 
Pre called with version 1.0-0
Post called with version 1.0-0

到目前为止,还算令人期待。运行安装前/安装后脚本。

现在让我们升级到1.1版本:

% sudo rpm -U sweh-test-1.1-0.x86_64.rpm
Pre called with version 1.1-0
Post called with version 1.1-0
Pre-un called with version 1.0-0
Post-un called with version 1.0-0

注意调用的顺序和版本号;调用预安装/后安装,并且版本发布与新版本匹配,然后使用旧版本号调用预/后卸载。

所以我们的想法是你不需要派生此信息,您可以通过使用%宏将其直接包含在 rpm 规范文件中。

答案2

不直接。当您进行安装时,rpm 数据库被锁定。最简单的方法是在您维护的 rpm 中以文本文件的形式提供该信息。

相关内容