【问题标题】:Gradle: Iterate over test dir and perform muiltiple tasks in each dirGradle:迭代测试目录并在每个目录中执行多个任务
【发布时间】:2017-10-19 21:17:01
【问题描述】:

我想遍历我的 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 闭包 (issue) 内执行,因为从未正式支持从 doFirst/doLast 调用任务 (SO answer)。

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

不要附带dependsOn,这不适用于我的情况。在此示例中,我仅在此处使用它来说明 lessCompile 是一个静态任务,这与我尝试从 doLast 块中调用的其他任务相反。

【问题讨论】:

  • Gradle 任务在构建中只能执行一次。因此,您可以对所有目录使用一项任务(和一次执行),也可以对每个目录使用一项任务。

标签: gradle build.gradle


【解决方案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))))
    }
}

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

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

任务定义以相反的执行顺序出现可能会造成混淆,但这是由dependsOn 链引起的。您可以改用finalizedBy,但我认为这些是需要在其他任务之前完成的任务,而不是需要在其他任务之后完成的任务.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    相关资源
    最近更新 更多