Gradle:迭代测试目录并在每个目录中执行多个任务

时间:2017-10-19 10:23:56

标签: gradle build.gradle

我想迭代我的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关闭(issue)内无法执行doLast任务,因为从doFirst / {{1调用任务永远不会得到官方支持(SO answer)。

然而,官方的方法是迭代dirs,执行测试并将参数传递给这些任务。

并没有doLast来,这对我的情况不起作用。我在此示例中仅使用它来说明dependsOn是一个静态任务,与我尝试在lessCompile块中调用的其他任务相反。

1 个答案:

答案 0 :(得分:1)

实际上,任务从不执行内部其他任务或其doFirst / doLast关闭。

StackOverflow question you linked的主题是直接在任务上调用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))))
    }
}

对于包含子文件夹testtest1的文件夹test2,这将最终执行gradle runAllTests的以下任务:

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

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