【问题标题】:rpmbuild: common ownership of directoriesrpmbuild:目录的共同所有权
【发布时间】:2015-07-16 01:16:58
【问题描述】:

假设我为 myprog1 和 myprog2 构建的软件包将安装在 /usr/lib/mysystem/myprog1/ 和 /usr/lib/mysystem/myprog2/ 中

根据一些发行版的文档,例如在 OpenSUSE 的情况下,两个包都必须拥有共享目录。但是在 .spec 文件中是如何实现的呢?以下是正确的吗?

%files
/usr/lib/mysystem

或者我需要这样做

%files
%dir /usr/lib/mysystem
/usr/lib/mysystem/myprog<1|2>

【问题讨论】:

    标签: linux rpm rpmbuild rpm-spec


    【解决方案1】:

    这取决于,特别是如果 program1 和 program2 的包是从一个来源构建或形成完全不同的来源。

    如果它们来自一个来源,您必须以更复杂的方式进行区分:

    %files program1
    %dir /usr/lib/mysystem
    /usr/lib/mysystem/program1
    
    %files program2
    %dir /usr/lib/mysystem
    /usr/lib/mysystem/program2
    

    如果你单独构建它们,你可以这样做

    %files programX
    /usr/lib/mysystem
    

    如果您使用干净的 buildroot,但它只包含您的包创建的文件。

    但这样做也无妨

    %files programX
    %dir /usr/lib/mysystem
    /usr/lib/mysystem/programX
    

    也是。

    如果您有多个这样的包,您甚至可以创建一个拥有该目录的通用包,并且如果您有其他要求,它还可以提供其他要求。然后,需要这个“父包”、“公司包”或您想要的名称就足够了。

    那就够了

    Requires: mysystemcompanypackage
    ...
    %files
    /usr/lib/mysystem/program1
    

    【讨论】:

      【解决方案2】:

      通常只有一个包拥有一个给定的目录。在一个典型的系统上,会有一个包,如“文件系统”,它可能拥有诸如/bin 之类的东西。对于 Red Hat 和 OpenSUSE 上的 filesystem 软件包,该软件包拥有 /usr/bin 但不拥有该目录中的任何文件。

      您可以通过创建一个 wrapper-package 来做到这一点,它拥有在您的应用程序之间共享的东西,并使其成为安装到这些目录中的应用程序的依赖项 (Requires)。

      要查看 rpm 实际拥有的东西,您可以使用 -qf 选项,例如,

      rpm -qf /usr/lib/mysystem/myprog
      

      该命令适用于目录和文件。

      %dir%files 的文档是决定如何让包拥有目录的起点。在Maximum RPM: Taking the Red Hat Package Manager to the Limit,第 13 章 Directives For the %files list 中,它说:

      正如我们在the section called The %files List 中提到的,如果在 %files 列表中指定了一个目录,则该目录的内容以及该目录下每个目录的内容将自动包含在包

      解决这个问题的方法是使用 %dir 指令。通过将此指令添加到包含目录的行,RPM 将只打包目录本身,而不管创建包时目录中的文件是什么。下面是 %dir 的示例。

      %dir /usr/blather
      

      因此,建议的后一种情况遵循文档。但是,为了检查语法是否正确(即使 rpm 恰好构建),最好检查路径名列表。

      调查 Fedora 21 以查找 rpm -qf 显示相同目录的软件包会找到多个。例如,initscriptschkconfig 使用 %dir 指令来执行此操作:

      %dir /etc/rc.d
      %dir /etc/rc.d/rc[0-9].d
      %dir /etc/rc.d/init.d
      

      initscripts 规范文件中,并且

      /etc/rc.d
      /etc/rc.d/init.d
      /etc/rc[0-6].d
      /etc/rc.d/rc[0-6].d
      

      chkconfig 规范文件中。但是,initscripts 包需要/sbin/chkconfig,它由chkconfig 包提供。由于这种依赖关系,chkconfig 是目录的实际所有者。

      【讨论】:

      • 并不是只有一个包可以拥有它。例如,来自en.opensuse.org/openSUSE:Specfile_guidelines#Ownership:“在这种情况下,每个包都必须拥有 /usr/share/Foo/Animal 目录。”我在 Fedora 打包指南中看到了一个类似的示例。
      • 文档可能会产生误导。 rpm 程序可以告诉您 rpm 做了什么。如果您发现rpm -ql 列出了相同路径的两个同时安装的rpm,那么这是可以讨论的。
      • 所以你是说两个最大发行版的两组文档是错误的?他们甚至给出了不同的例子。我给了 OpenSUSE 的那个;这是 Fedora:“解决方案:git 和 bzr 包都应该拥有 /etc/bash_completion.d 目录”这对我来说意味着在 .spec 文件的 %files 部分中使用 %dir 指令列出共享目录(然后没有 %dir它拥有的子目录)。
      • 至于 rpm 的作用:它删除包含它不知道的文件的目录,因此只有在删除两个软件包时才会删除该目录(除非其中一个包用 %ghost 列出了该目录中其他人的内容)。
      • Thomas Dickey 写道:“如果您发现两个同时安装的 rpms rpm -ql 列出了相同的路径,那么这是可以讨论的”。我当然可以 - 我正在搜索 Stack Exchange 以了解更多关于 rpm 双重所有权的信息。
      猜你喜欢
      • 2015-08-19
      • 2014-07-20
      • 2019-10-31
      • 2015-07-31
      • 2021-11-30
      • 2015-02-24
      • 2010-11-29
      • 1970-01-01
      • 2021-10-14
      相关资源
      最近更新 更多