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

如何为Gradle文件集合中的每个文件执行shell命令?,shell,gradle,iteration,filetree,Shell,Gradle,Iteration,Filetree,我最近被指示在Gradle实现所有构建/发布工程工作 所以,我是格拉德尔的新手,在这个勇敢的新世界里,有些事情在弹壳提示下会变得非常明显,很难理解 我的构建创建了一组jar文件 我需要为它们中的每一个执行一个shell任务 类似于: task findBugs (type:Exec, dependsOn: fb23) {commandLine 'java', '-jar', './findBugs/findbugs.jar', '-textui', '-progress', '-xml',

我最近被指示在Gradle实现所有构建/发布工程工作

所以,我是格拉德尔的新手,在这个勇敢的新世界里,有些事情在弹壳提示下会变得非常明显,很难理解

我的构建创建了一组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'
}

但就我的一生而言,我不知道如何对返回的每个文件名执行shell命令

关于最直接的方法的想法


顺便问一下,在代码列表中包含换行符的最佳方法是什么?我必须返回并向每一行添加CR,以使它们换行……:(

您可以使用
字符串上的
执行
方法来执行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}"
  }
}
任务执行示例
def proc=“ls-l${f}”.execute();
进程waitFor();
println“返回代码:${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。查看它的外观。如果可以,请尝试对变量使用execute。请参阅:
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}"
  }
}