我已经有 20 年没有从头开始构建 RPM 了。所以我们可以有效地说“从不”。
[编辑] RPM 的要求是提供回滚、版本控制等。这是不可协商的。
我需要安装一个二进制文件和一个配置文件。有一些用户帐户和目录设置需要进行,我认为应该是直截了当的。
如果我想在 RPM 构建过程中进行测试的可重现构建,我必须复制我们的 CI 管道步骤。不平凡。理想情况下,我可以从其他位置提取所需的文件:
%prep
cp ${somefile} ${another file} $RPM_SOURCE_DIR
%setup
:
这可能吗?还是我错过了一些明显的解决方案。
谢谢。
从我的角度来看,这在一定程度上取决于您的目标是什么:
像 Fedora 这样的 Linux 发行版实际上期望他们的发行版构建软件是使用规范文件从源代码构建的(在一个密封的构建系统中,它也记录了用于构建的包/组件)并认为这是一个好的实践,也可以获得尽可能多的可重复性尽可能。
但是,您确实可以只提取预构建的二进制文件并在规范文件中使用它们来构建 RPM 包,这是您场景的缩短示例:
虽然这可能有效,但您应该明确检查生成的 RPM 包的依赖项是否合适 (
rpm -qp --requires <…>.rpm
) 或者是否缺少运行时依赖项。通常有编译时选项或参数(例如CFLAGS
,或LDFLAGS
用 C 编写的软件)以及后处理脚本(例如/usr/lib/rpm/(redhat/)brp-*
) 同时构建 RPM 包,为您添加特定于分发的内容和/或提取运行时依赖项。这可能与您相关,也可能不相关(并且一些后处理脚本也可能适用于预构建的二进制文件,但由于缺少编译器选项而其他不适用)。虽然我打包了很多软件,但我对 Haskell 没有经验,但是在查看一些 Fedora 包时,有些 RPM 包具有运行时依赖项(如果存在运行时依赖项,则必须满足RPM 包,因为这就是 RPM 的工作方式;并且在文件系统的某个位置拥有匹配的库是不够的,因为 RPM 不会知道它,除非它是由 RPM 包提供的)。因此,关于上面的例子:虽然
SourceX:
可以给定一个 URL,但在构建 RPM 包时rpmbuild
仍然希望这些文件在SOURCES
目录中的磁盘上(因此它们如何进入SOURCES
目录取决于您)。鉴于您没有提及您的目标是哪个 Linux 发行版,我在此处链接 Fedora 的Haskell 打包指南 ,它可能会或可能不会提供进一步的启发。是的,RPM 包可以是交叉分发的,这实际上通常会导致 RPM 包中的静态二进制文件,因为不同的 Linux 发行版上通常有不同的库/包版本。