5.3. Epoch, Scriptlets 和 Triggers
本节介绍 Epoch
、Scriptlets
和 Triggers
,它们代表 RMP spec
文件的高级指令。
所有这些指令都影响不仅影响 spec
文件,还影响到安装结果 RPM 的末尾机器。
5.3.1. Epoch 指令 复制链接链接已复制到粘贴板!
Epoch
指令支持根据版本号定义权重的依赖关系。
如果 RPM spec
文件中没有列出此指令,则不会设置 Epoch
指令。这与常规的理解不同:不设置 Epoch
的结果是 Epoch
为 0。但是,出于解算的目的,yum
工具会将未设置的 Epoch
视为与 Epoch
等于 0 一样。
但是,在 spec
文件中列出 Epoch
通常会省略,因为大多数情况下,在引入 Epoch
值时,在比较软件包版本时会出现预期的 RPM 行为。
例 5.2. 使用 Epoch
如果您使用 Epoch: 1
和 Version: 1.0
安装 foobar
软件包,且其他人使用 Version: 2.0
打包了 foobar
,但没有 Epoch
指令,新版本永远不会被视为更新。原因是,在签发 RPM 软件包版本是首选使用 Epoch
版本而不是传统的 Name-Version-Release
marker。
使用 Epoch
比较罕见。但是,Epoch
通常用于解决升级排序问题。在软件版本号方案或带有字母字符的版本中,这个问题可能会出现上游变化的影响,这些字符不能始终根据编码进行可靠地进行比较。
5.3.2. scriptlets 指令 复制链接链接已复制到粘贴板!
Scriptlets 是一组在安装或删除软件包之前或之后执行的 RPM 指令。
使用 Scriptlets 仅在构建时或启动脚本中无法完成的任务。
存在一组常用 Scriptlet 指令。它们与 spec
文件部分标头类似,如 %build
或 %install
。它们由多行代码段定义,这些片段通常写为标准的 POSIX shell 脚本。但是,它们也可以使用其他适用于目标机器分布接受的 RPM 编程语言编写。RPM 文档包括可用语言的详尽列表。
下表包含 Scriptlet 指令,按其执行顺序列出。请注意,包含脚本的软件包会在 %pre
和 %post
指令之间安装,并在 %preun
和 %postun
指令之间卸载。
指令 | 定义 |
---|---|
| Scriptlet 在安装或删除任何软件包之前执行。 |
| Scriptlet 在目标系统上安装软件包之前执行。 |
| Scriptlet 仅在目标系统上安装软件包后执行。 |
| 在从目标系统卸载软件包前执行的 Scriptlet。 |
| Scriptlet 在软件包从目标系统卸载后执行。 |
| 在事务结束时执行的 Scriptlet。 |
5.3.3. 关闭 scriptlet 执行 复制链接链接已复制到粘贴板!
下面的步骤描述了如何使用 rpm
命令和 --no_scriptlet_name_
选项一起关闭任何 scriptlet 的执行。
流程
例如,要关闭
%pretrans
scriptlets 的执行,请运行:rpm --nopretrans
# rpm --nopretrans
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您还可以使用
-- noscripts
选项,它等同于以下所有:-
--nopre
-
--nopost
-
--nopreun
-
--nopostun
-
--nopretrans
-
--noposttrans
-
5.3.4. scriptlets 宏 复制链接链接已复制到粘贴板!
Scriptlets 指令也适用于 RPM 宏。
以下示例显示了使用 systemd scriptlet 宏,这样可确保 systemd 会收到有关新单元文件的通知。
5.3.5. Triggers 指令 复制链接链接已复制到粘贴板!
Triggers 是 RPM 指令,可提供在软件包安装和卸载期间交互的方法。
Triggers 可能会在意外执行,例如在更新包含软件包时执行。很难调试 Triggers,因此需要以可靠的方式实施它们,以便在意外执行时不会中断任何操作。因此,红帽建议尽可能减少使用 Triggers。
下面列出了一次软件包升级的顺序以及每个现有 Triggers 的详情:
以上项目位于 /usr/share/doc/rpm-4.*/triggers
文件中。
5.3.6. 在 spec 文件中使用非 shell 脚本 复制链接链接已复制到粘贴板!
spec
文件中的 -p
scriptlet 选项允许用户调用特定的解释器,而不是默认的 shell 脚本解释器(-p /bin/sh
)。
下面的步骤描述了如何创建脚本,它会在安装 pello.py
程序后输出信息:
流程
-
打开
pello.spec
文件。 找到以下行:
install -m 0644 %{name}.py* %{buildroot}/usr/lib/%{name}/
install -m 0644 %{name}.py* %{buildroot}/usr/lib/%{name}/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在上面的行下,插入:
%post -p /usr/bin/python3 print("This is {} code".format("python"))
%post -p /usr/bin/python3 print("This is {} code".format("python"))
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 按照构建 RPM 中所述构建您的软件包。
安装软件包:
yum install /home/<username>/rpmbuild/RPMS/noarch/pello-0.1.2-1.el8.noarch.rpm
# yum install /home/<username>/rpmbuild/RPMS/noarch/pello-0.1.2-1.el8.noarch.rpm
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 安装后检查输出信息:
Installing : pello-0.1.2-1.el8.noarch 1/1 Running scriptlet: pello-0.1.2-1.el8.noarch 1/1 This is python code
Installing : pello-0.1.2-1.el8.noarch 1/1 Running scriptlet: pello-0.1.2-1.el8.noarch 1/1 This is python code
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
要使用 Python 3 脚本,请在 spec
文件中 install -m
下包含以下行:
%post -p /usr/bin/python3
%post -p /usr/bin/python3
要使用 Lua 脚本,在 SPEC 文件中的 install -m
下包含以下行:
%post -p <lua>
%post -p <lua>
这样,您可以在 spec
文件中指定任何解释器。