是否存在用于检索文件夹中的文件列表或包含给定字符串、字符串集或模式的文件夹集的分级模式?
我的项目产生RPM,并且正在使用Nebula类型(伟大的软件包!)有几种不同类型的文件需要后处理。我试图生成包含字符串的文件列表,这些字符串是后处理的指示符。例如,包含"@ doc“的文件需要由doc生成器脚本处理。包含"@HOSTNAME@“和"@HOSTFQDN@”的文件需要由sed处理,以便用实际主机名或主机fqdn替换字符串。
包中的搜索根目录将是src\main\resources。其结果是,构建脚本设置后安装脚本命令--类似于:
postInstall('/opt/product/bin/postprocess.sh ' + join(filesContainingDocs, " "))
postInstall('/bin/sed -i -e "s/@HOSTNAME@/$(hostname -s)/" -e s/@HOSTFQDN@/$(hostname)/" ' + join(filesContainingHostname, " ")
我可以搞清楚后置语法。我很难找到对文件内容(而不是文件名称)进行操作的任何常规Gradle 'things‘(即FileTree)的过滤器。我将如何填充filesContainingDocs和filesContainingHostname --大致如下所示:
filesContainingDocs = FileTree('src/main/resources', { contents.matches('@doc') }
filesContainingHostname = FileTree('src/main/resources', { contents.matches('@(HOSTNAME|HOSTFQDN)@') }
虽然后处理脚本可以简单地执行grep,但我们产品中的几个RPM相互覆盖,每个RPM只应该对它提供的文件进行后处理,所以在最终安装的文件夹上建立一个通用的grep是不可行的--它会捕获其他RPM提供的文件。在我看来,在构建时,我应该能够从包含给定RPM项目的更多源文件中生成正确的静态文件列表。
它不必是FileTree --运行像findstr /s /m /c:"@doc" src\main\resources\*.conf
这样的命令(唉,构建平台是findstr /s /m /c:"@doc" src\main\resources\*.conf
)会在stdout中生成答案,但我不知道如何将这个结果放入一个对象Gradle可以用来扩展结果的对象。(我还怀疑有一种“更沉重的方式”来做到这一点。)
文件集和这些文件的内容通常是相当小的。
发布于 2022-02-21 00:40:20
--我很难找到对文件内容(而不是文件名称)进行操作的任何常规Gradle 'things‘(即FileTree)的过滤器。
您可以在Gradle文件树上应用任何您可以想象到的过滤器,最后它只是在JVM中运行的Groovy (或Kotlin)代码。每个级别的FileTree
只不过是File
对象的一个(延迟计算的)集合。为了过滤这些File
对象,您可以读取它们的内容,例如,用同样的方式在Java中读取它们。Groovy甚至提供了一个JDK enhancement for the Java class File
,其中包括用于此目的的简单方法getText()
。现在,您可以轻松地筛选包含特定字符串的文件:
filesContainingDocs = fileTree('src/main/resources').filter { file ->
file.text.contains('@doc')
}
使用Groovy,您可以像.getText()
一样以访问字段的方式调用getter(本例中是.text
)。
如果一个简单的contains
检查还不够,Groovy增强甚至提供了CharSequence
/string
实例上的matches(Pattern pattern)
方法来执行常规的扩展检查:
filesContainingDocs = fileTree('src/main/resources').filter { file ->
file.text.replace('\r\n','\n').matches('.*some regex.*') }
}
https://stackoverflow.com/questions/71193701
复制相似问题