我正在尝试使用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,我找不到任何控制此行为的设置 .

任何人都可以猜测可能会发生什么,以创造这种行为差异?

Update: this post有一些关于它如何工作的非常好的信息,但我仍然不知道任何改变这种行为的指令的名称 .

Update 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可执行文件本身的配置允许删除?