如何为 Gradle 文件集合中的每个文件执行 shell 命令?
Posted
技术标签:
【中文标题】如何为 Gradle 文件集合中的每个文件执行 shell 命令?【英文标题】:How to execute a shell command for each file in a Gradle file collection? 【发布时间】:2014-02-27 01:32:06 【问题描述】:我最近被指示在 Gradle 中实施所有构建/发布工程作业。
所以我是 Gradle 的新手,在这个勇敢的新世界中,一些在 shell 提示下显而易见的东西很难理解。
我的构建创建了一组 jar 文件。
我需要为它们中的每一个执行一个 shell 任务
类似于:
task findBugs (type:Exec, dependsOn: fb23) commandLine 'java', '-jar',
'./findBugs/findbugs.jar', '-textui', '-progress', '-xml', '-output',
'TrustManagerService.xml', 'TrustManagerService.jar'
(我无法使用 FindBugs 插件,因为我们在 JDK8 中 - 所以我正在从预览版外部运行 FindBugs...)
我可以获取文件集合并使用以下内容遍历文件名:
FileTree iotTree = fileTree(dir: '.')
iotTree.include '*.jar'
iotTree.each
File file -> println file.name
println 'A file'
或
def iotJars = files(file('./jars').listFiles())
println ''
println iotJars
iotJars.each File file -> println 'The next file is: ' + file.name
但是对于我的生活,我看不到如何为每个返回的文件名执行 shell 命令......
对最直接的方法的想法??
顺便说一句 - 在代码清单中包含换行符的最佳方法是什么 - 我必须返回并将 CR 添加到每一行以使它们中断...:(
【问题讨论】:
见:gradle.org/docs/current/userguide/working_with_files.html 【参考方案1】:您可以在String
上使用execute
方法来执行shell 命令。
这是一个示例任务:
task executeExample <<
FileTree ioTree = fileTree(dir: ".")
ioTree.each f ->
def proc = "ls -l $f".execute();
proc.waitFor();
println "return code: $ proc.exitValue()"
println "stderr: $proc.err.text"
println "stdout: $proc.in.text"
【讨论】:
我很想能够使用这种结构——但使用比 ls 等更复杂的东西。我会遇到各种解析错误。 例如:def cmdLine = 'java -jar ./findBugs/findbugs.jar -textui -progress -xml -output FBJars/' + baseName + '.xml FBJars/' + baseName + '。 jar'.execute() - 当我尝试执行它时,带或不带双引号都会引发错误... 尝试首先将命令分配给字符串变量,然后执行变量的 println。看看它的样子。如果没问题,请尝试在变量上使用执行。以上是关于如何为 Gradle 文件集合中的每个文件执行 shell 命令?的主要内容,如果未能解决你的问题,请参考以下文章
如何为Android NDK的gradle构建文件中指定NDK
如何为 Spring Boot 应用程序的 gradle 构建设置活动配置文件?
android studio,如何为发布版本制作签名的 apk(使用 KTS 构建文件的 gradle)
Gradle:如何为需要相同 Activity 但具有不同意图过滤器的不同 buildType 合并 Android 清单文件