构建.渐变:遍历测试目录,并在每个目录中执行多个任务



我想迭代我的test/目录,该目录包含每个测试用例的子文件夹,然后想在每个子文件夹中执行不同的任务。

这不起作用:

plugins {
id 'com.github.eerohele.saxon-gradle' version '0.3.0'
}
task lessCompile {
description 'compile less to css'
...
}
task runAllTests(dependsOn: lessCompile) {
description 'runs all tests'
doLast {
new File(testFolder).eachDir() { testcase->
println testcase
// transform test_dev.xml to test_dev_prep.xml
xslt {
input file(testcase + '/test_dev.xml')
stylesheet file('xslt/prepare.xsl')
output file(testcase + '/test_dev_prep.xml')
}
exec {
workingDir '.'
commandLine 'cmd', "/c sys-command $testcase -param ..."
}
javaexec {
classpath = buildscript.configurations.classpath
main = '.....'
args = ['-headless', '-f1', "$testcase/file1" ]
}
}
}
}

runAllTests任务失败,因为xslt任务无法在doLast闭包内执行(问题),因为从未正式支持从doFirst/doLast调用任务(SO应答)。

然而,对dirs进行迭代、执行测试并将参数传递给这些任务的官方方式是什么。

不要附带dependsOn,这对我的情况不起作用。在这个例子中,我只是用它来说明lessCompile是一个静态任务,与我试图从doLast块中调用的其他任务相反。

实际上,任务从未在其他任务或其doFirst/doLast闭包内执行

您链接的StackOverflow问题的主题是关于直接在任务上调用execute,您应该永远不要这样做,因为这可能会破坏Gradle的任务系统。你真正想做的是调用一个与特定任务完全相同的方法,但这根本不可能。

Gradle提供了方法copydeleteexecjavaexec,但这些方法都与任务无关,即使它们可以提供相同的配置接口。在当前示例中,只有两个任务:lessCompilerunAllTests

因此,要在Gradle中为多个目录和不同的配置(如输入和输出文件)做一些事情,您需要为每个目录创建一个新任务:

task lessCompile() { /* configure lessCompile task */ }
task runAllTests() {
file('test').eachDir { testcase ->
dependsOn (tasks.create([name: "$testcase.name|javaexec", type: JavaExec], {
// configure javaexec task
}).dependsOn (tasks.create([name: "$testcase.name|exec", type: Exec], {
// configure exec task
}).dependsOn (tasks.create([name: "$testcase.name|xslt", type: SaxonXsltTask], {
// configure xslt task
}).dependsOn (lessCompile))))
}
}

对于具有子文件夹test1test2的文件夹test,这将最终执行gradle runAllTests的以下任务:

:lessCompile
:test1|xslt
:test1|exec
:test1|javaexec
:test2|xslt
:test2|exec
:test2|javaexec
:runAllTests

任务定义以与执行相反的顺序出现可能会令人困惑,但这是由dependsOn链引起的。您可以使用finalizedBy,但我认为这些情况是需要在其他任务之前完成的任务,而不是在其它任务之后需要完成的任务。

最新更新