我正在尝试使用Nebula rpm plugin for Gradle来构建RPM。我发现以这种方式构建的RPM与使用spec文件和rpmbuild构建传统方式的RPM之间存在以下差异。
在spec文件中,您可能会遇到以下情况:
%dir /usr/local/myapp/logs
这将在安装rpm时创建目录/usr/local/myapp/logs
。一旦myapp开始运行,它就会将日志写入此目录。卸载应用程序时,rpm会理解/usr/local/myapp/logs
下的文件不是由rpm安装过程创建的,因此不会删除此目录或其中的文件。如果在卸载时目录为空,则将删除该目录。
Gradle插件有类似的指令。如果你包括
directory('/usr/local/myapp/logs')
在构建脚本中,将创建此目录,类似于rpm进程。但是,在这种情况下,当卸载rpm时,将删除自安装以来在其中添加的目录和任何文件。
我正在努力解释这种差异。 RPM插件基于redline-rpm java package,通过查看源代码和通常的RedHat rpm documentation,我找不到任何控制此行为的设置。
任何人都可以猜测这里可能会发生什么,以创造这种行为上的差异?
更新: this post有一些关于其工作原理的非常好的信息,但我仍然不知道任何改变此行为的指令的名称。
更新2 现在开始变得非常有趣了。如果我在使用Gradle插件构建的rpm上运行rpm -evv myapp
,安装后以及将文件添加到/usr/local/myapp/logs
后,我会看到以下内容:
D: fini 040755 2 (7007, 500) 4096 /usr/local/myapp/logs
D: erase rmdir of /usr/local/myapp/logs failed: Directory not empty
但仍然在操作完成后,目录消失了! 怎么会这样?是否有一些rpm可执行文件本身的配置允许删除?