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,是啥意

C4250 VC++ 警告是啥意思?

Chrome Profiler 中的“未优化”警告是啥意思?

通过 rpmbuild 打包符号链接?

某些 Java 泛型类型转换中的类型安全警告是啥意思?

@SuppressWarnings是啥意思?