RPM specfile 中 $1 值的研究 | little boy
本博客的开篇,标题借用 Marguerite.su 女王的 《RPM specfile 中 $1 值的研究》日志以表敬仰。
RPM 工作流程
这几天翻译 How to create an RPM package,发现 RPM Spec 不像表面上看着那么简单。下面简述 RPM 工作流程。
- 安装流程:%pre -> 安装文件 -> %post
- 卸载流程:%preun -> 卸载文件 -> %postun
- 升级流程:new-%pre -> 安装文件 -> new-%post -> old-%preun -> 卸载文件 -> old-%postun
在以上流程中,%XXX 阶段执行的脚本被称为 脚本片段 (Scriptlet)。它用于在 RPM 包安装/升级/卸载时,对系统执行必要操作。在升级过程中,先安装新包,再卸载旧包。卸载旧包时,不会删除新包已安装的文件,以此完成升级。
假设在 %post 中编写创建文件的脚本,在 %postun 中删除此文件。安装/卸载都很顺利,但升级时问题来了。执行 old-%postun 时,会将 new-%post 中创建的文件删除。为了解决此问题,RPM 向脚本传入一个参数,表示各个阶段此软件包的数量。通过判断 $1 参数的值,执行不同动作。
参数值列表
另外,RPM 还有许多高级特性,如触发器、事务等。以下列出一个完整的参数值列表,供参考: