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

标签 gradle build.gradle

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

这不起作用:

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 内执行关闭 ( issue ) 因为从 doFirst 调用任务/doLast从未得到官方支持(SO answer)。

但是,迭代目录、执行测试并将参数传递给这些任务的官方方法是什么。

不要带dependsOn ,这不适用于我的情况。在这个例子中我只用它来说明 lessCompile与我尝试从 doLast 中调用的其他任务相反,这是一项静态任务堵塞。

最佳答案

实际上,任务是从不执行里面 其他任务或他们的doFirst/doLast关闭。

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

Gradle 提供了方法 copy , delete , exec javaexec ,但这些都与任务无关,即使它们可能提供相同的配置界面。在您当前的示例中,只有两个任务: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))))
    }
}

对于文件夹 test带有子文件夹 test1test2这将最终为 gradle runAllTests 执行以下任务:
:lessCompile
:test1|xslt
:test1|exec
:test1|javaexec
:test2|xslt
:test2|exec
:test2|javaexec
:runAllTests

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

关于Gradle:迭代测试目录并在每个目录中执行多个任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46827751/

相关文章:

java - 为什么无法在 IntelliJ 中启动 Android 项目?

gradle - 我可以使Gradle依赖项依赖来强制版本吗?

gradle - 强制从存储库下载依赖项,但仅针对特定程序包

github - 无法在 Jitpack 上发布 : Execution failed for task ':install'

gradle - Gradle-如何从根项目发布子项目

android - 在运行时更改Gradle依赖项中的代码

gradle - gradle protobuf插件不起作用

gradle - Gradle构建未调用JUnit

android - Flutter:尝试向 FlutterEngine 自动注册插件,但找不到并调用 GeneratedPluginRegistrant

maven - 从属性文件中读取 gradle 存储库凭据的最佳方法是什么?