我需要为包中的一个主要目录指定公共属性,并为它的一些子目录指定特殊权限。例如
%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
下的所有内容来解决这个问题。还有别的办法吗?由于
我在这里发布只是以防有人有同样的问题,发现这个老问题。
最近(最近的时间取决于发行版)宏%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一起工作,但不与%文件中的其他指令一起工作(例如,我可以使用regex来排除但不包括,doh)
改成:
%files
%dir %attr(-, myuser, mygroup) /opt/myapp
%attr(750, myuser, mygroup) /opt/myapp/bin
注意目录的%dir
。
这意味着-它列出了两次。,)我从来没有遇到过问题,但我不知道哪个会赢。
作为旁注,您可能不应该单独列出/etc
,因为您不想拥有它。
出现此错误的一个原因可能是您在%files
下列出了该目录以及该目录中的文件。
的例子:
%files
%{_bindir}/%{name}-%{version}/dir
%{_bindir}/%{name}-%{version}/dir/file
在这种情况下,您可以像这样列出目录:
%files
%{_bindir}/%{name}-%{version}/dir
或者列出目录%dir
,然后列出文件,像这样:
%files
%dir %{_bindir}/%{name}-%{version}/dir
%{_bindir}/%{name}-%{version}/dir/file
我在RH 8.6上使用rpmbuild的当前版本,这些解决方案都不起作用。正如在评论中发布的,%排除删除文件和目录,而%dir删除其下的所有子目录和文件,除非指定。示例servlet_workspace是tomcat目录路径,它指向一个由2个文件和5个目录组成的目录树。
%files
%attr(-, tomcat, tomcat) %{servlet_workspace}
%attr(0664, tomcat, tomcat) %{servlet_workspace}/logs/%{conf_file}.sample
%attr(0775, tomcat, tomcat) %{servlet_workspace}/stitcherStuff/reboot.sh
添加%dir将删除servlet_workspace下的所有子目录。
%files
%dir %{servlet_workspace}
%attr(0664, tomcat, tomcat) %{servlet_workspace}/logs/%{conf_file}.sample
%attr(0775, tomcat, tomcat) %{servlet_workspace}/stitcherStuff/reboot.sh