我已经 20 年没有从头开始构建过 RPM 了。所以我们可以说“永远没有”。
[编辑] RPM 的要求是提供回滚、版本控制等功能。这是不可商榷的。
我需要安装一个二进制文件和一个配置文件。需要进行一些用户帐户和目录设置,我认为这些设置应该很简单。
如果我想要在 RPM 构建过程中进行经过测试的可重现构建,我必须复制我们的 CI 管道步骤。这很不简单。理想情况下,我可以从其他位置提取所需的文件:
%prep
cp ${somefile} ${another file} $RPM_SOURCE_DIR
%setup
:
这可能吗?还是我遗漏了一些明显的解决方案。
谢谢。
答案1
从我的角度来看,这有点取决于你的目标到底是什么:
像 Fedora 这样的 Linux 发行版实际上期望它们的发行版构建使用 spec 文件(在密封的构建系统内,还记录用于构建的包/组件)从源代码构建软件,并将其视为一种很好的做法,同时也获得了尽可能多的可重复性。
但是,您确实可以提取预先构建的二进制文件并在 spec 文件中使用它们来构建 RPM 包,以下是适合您场景的简化示例:
# […]
Source0: <binary file>
Source1: <config file>
# […]
%prep
%setup -q -c -T
%build
%install
install -D -p -m 0755 %{SOURCE0} $RPM_BUILD_ROOT%{_bindir}/%{name}
install -D -p -m 0644 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/%{name}.conf
# […]
虽然这可能有效,但您应该明确检查生成的 RPM 包的依赖项是否合适(rpm -qp --requires <…>.rpm
)或是否缺少运行时依赖项。在构建 RPM 包时,通常会有编译时选项或参数(例如CFLAGS
或LDFLAGS
用 C 编写的软件)以及后处理脚本(例如/usr/lib/rpm/(redhat/)brp-*
),它们会为您添加特定于发行版的内容和/或提取运行时依赖项。这可能与您有关,也可能无关(并且某些后处理脚本也可能适用于预构建的二进制文件,但其他脚本由于缺少编译器选项而不适用)。虽然我正在打包很多软件,但我对 Haskell 并不熟悉,但在查看一些 Fedora 软件包时,有些 RPM 软件包具有运行时依赖项(如果存在运行时依赖项,则 RPM 软件包必须满足这些依赖项,因为这就是 RPM 的工作方式;并且仅在文件系统的某个地方有匹配的库是不够的,因为除非它由 RPM 包提供,否则 RPM 不会知道它)。因此,从预构建的二进制文件构建 RPM 包可能会导致 RPM 包没有适当的依赖关系,这可能会在以后显示为运行时错误。
关于上面的例子:虽然SourceX:
可以给出一个 URL,但在构建 RPM 包时rpmbuild
仍然需要这些文件在目录中的磁盘上SOURCES
(因此它们如何进入目录SOURCES
取决于您)。
鉴于你没有提到你的目标是哪个 Linux 发行版,我链接了 Fedora 的Haskell 包装指南 这里,这可能会或可能不会提供进一步的启发。是的,RPM 包可以跨发行版,这实际上通常会导致 RPM 包内出现静态二进制文件,因为不同的 Linux 发行版上通常有不同的库/包版本。