AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1077113
Accepted
meangrape
meangrape
Asked: 2021-09-10 09:10:51 +0800 CST2021-09-10 09:10:51 +0800 CST 2021-09-10 09:10:51 +0800 CST

我应该通过 RPM SPEC 文件构建我的 Haskell 应用程序还是尝试使用 CI 管道中的(可重现的)二进制文件

  • 772

我已经有 20 年没有从头开始构建 RPM 了。所以我们可以有效地说“从不”。

[编辑] RPM 的要求是提供回滚、版本控制等。这是不可协商的。

我需要安装一个二进制文件和一个配置文件。有一些用户帐户和目录设置需要进行,我认为应该是直截了当的。

如果我想在 RPM 构建过程中进行测试的可重现构建,我必须复制我们的 CI 管道步骤。不平凡。理想情况下,我可以从其他位置提取所需的文件:

%prep
cp ${somefile} ${another file} $RPM_SOURCE_DIR
%setup
:

这可能吗?还是我错过了一些明显的解决方案。

谢谢。

rpm
  • 1 1 个回答
  • 76 Views

1 个回答

  • Voted
  1. Best Answer
    rsc
    2021-09-15T20:43:45+08:002021-09-15T20:43:45+08:00

    从我的角度来看,这在一定程度上取决于您的目标是什么:

    像 Fedora 这样的 Linux 发行版实际上期望他们的发行版构建软件是使用规范文件从源代码构建的(在一个密封的构建系统中,它也记录了用于构建的包/组件)并认为这是一个好的实践,也可以获得尽可能多的可重复性尽可能。

    但是,您确实可以只提取预构建的二进制文件并在规范文件中使用它们来构建 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) 或者是否缺少运行时依赖项。通常有编译时选项或参数(例如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 发行版上通常有不同的库/包版本。

    • 1

相关问题

  • 将 rpm 命令转换为 dpkg

  • 通过 RPM 管理配置?

  • 用于维护 yum 存储库的工具

  • 用于 centos 的 Python 源 RPMS?

  • 可以使用 easy_install 和 bdist_rpm 安装吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve