【问题标题】:what does the rpmbuild warning "File listed twice" ACTUALLY MEAN?rpmbuild 警告“文件列出两次”实际上是什么意思?
【发布时间】:2012-12-11 10:24:33
【问题描述】:

我需要为包中的一个主要目录指定通用属性,并为其中的一些子目录指定特殊权限。例如

%files
%attr(-, myuser, mygroup) /opt/myapp 
%attr(750, myuser, mygroup) /opt/myapp/bin  # no exec permission to other
/etc  # this is the reason I can't use %defattr(-, myuser, mygroup)

我自然会在 /opt/myapp/bin 下的每个文件上收到“文件列出两次”警告。我的问题是,它实际上是什么意思? rpmbuild 用它做什么?我在任何地方都找不到答案。我可以忽略它吗?什么优先,第一次出现还是最后一次出现?

我不想明确列出myapp 下的所有内容来解决这个问题。还有其他方法吗?谢谢

【问题讨论】:

    标签: installation rpm rhel rpmbuild software-packaging


    【解决方案1】:

    这意味着 - 它被列出了两次。 ;) 我从来没有遇到过问题,但我不知道哪个会赢。

    附带说明一下,您可能不应该单独列出 /etc,因为您不想拥有它。

    【讨论】:

    • 这个答案是错误的。如果您列出 /etc,rpm 将“拥有”所有在 %{buildroot}/etc 中的文件,而不是在 /etc 中。因此,在 %files 部分列出 /etc 是常见的做法,没有任何真正的缺点
    • 如果你尝试安装两个试图拥有/etc的包,RPM会拒绝安装第二个,这就是为什么要避免。
    • 这仅适用于 %dir /etc。如果您只是列出 /etc 包拥有的文件是其中的文件,而不是目录本身
    【解决方案2】:

    改成这样:

    %files
    %dir %attr(-, myuser, mygroup) /opt/myapp
    %attr(750, myuser, mygroup) /opt/myapp/bin
    

    注意目录的%dir。这应该摆脱列出两次警告的文件。

    【讨论】:

    【解决方案3】:

    我在这里发帖以防万一有人遇到同样的问题并发现这个老问题。

    最近(多长时间取决于发行版)宏 %exclude 已添加到 rpmbuild。

    %files
    %attr(-, myuser, mygroup) /opt/myapp
    %exclude /opt/myapp/bin
    %attr(750, myuser, mygroup) /opt/myapp/bin  # no exec permission to other
    

    这里的优势并不像排除一组文件或文件夹那样明显:

    %files
    %attr(-, myuser, mygroup) /opt/myapp
    %exclude /opt/myapp/[bin|data|whatever]
    %attr(750, myuser, mygroup) /opt/myapp/bin  # no exec permission to other
    %attr(777, myuser, myothergroup) /opt/myapp/data
    %attr(640, myuser, myothergroup) /opt/myapp/whatever
    

    奇怪的是,[a|b] 语法适用于 %exclude,但不适用于 %files 中的其他指令(例如,我可以使用正则表达式排除但不包含,doh)

    【讨论】:

    • 谢谢,它成功了。所以我可以做 /home/oracle/scripts %exclude /home/oracle/scripts/myconfig.config %config(noreplace) /home/oracle/scripts/myconfig.config 没有关于重复文件的警告
    • 不幸的是,在我的 CentOS 5.5 上添加 %exclude 不允许我稍后重新包含文件。
    • 虽然这确实抑制了错误,但它也会导致软件包在 rpmbuild 4.8.0 上根本不包含该文件 - 这不是预期的结果。 :)
    • @dannysauer 您需要在 %exclude 语句之后明确包含您需要的文件。我已经有一段时间没有构建任何 rpm 包了,我得在 rpmbuild 4.8.0 上尝试一下
    • @Bruno9779 我确实在排除之后包含,就像在包含目录的示例中一样,然后排除然后包含其中的子目录和文件。它是 RHEL6,所以可能只是一个旧的错误/行为。无论如何,我真的需要将此过程移至 RHEL7 系统。 ;)
    猜你喜欢
    • 2020-05-12
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 2020-02-15
    • 2011-02-08
    相关资源
    最近更新 更多