rpmbuild 警告“文件列出两次”实际上是啥意思?
Posted
技术标签:
【中文标题】rpmbuild 警告“文件列出两次”实际上是啥意思?【英文标题】: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
下的所有内容来解决这个问题。还有其他方法吗?谢谢
【问题讨论】:
【参考方案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
。这应该摆脱列出两次警告的文件。
【讨论】:
请注意using %dir will make it an empty directory。因此,如果您需要将所有内容都包含在 /opt/myapp 并且自定义配置仅 bin 子目录的权限,这将没有那么有用。 上面评论中的链接不再有效。请改用ftp.rpm.org/max-rpm/s1-rpm-inside-files-list-directives.html。【参考方案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 系统。 ;)以上是关于rpmbuild 警告“文件列出两次”实际上是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
the hash for the file is not present in the specified catalog file,是啥意