如何为Gradle文件集合中的每个文件执行shell命令?

时间:2014-02-27 01:32:07

标签: shell gradle iteration filetree

我最近被指示在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以使它们中断...... :(

1 个答案:

答案 0 :(得分:8)

您可以在execute上使用String方法执行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}"
  }
}