我有以下场景:
- 我安装了软件包的版本 1,它在安装后执行自定义操作(将一些文件复制到某个位置)
- 我安装了同一软件包的版本 2
- 我想卸载版本 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 中以文本文件的形式提供该信息。