Gradle如何从任务规则生成新任务

时间:2017-10-26 21:46:55

标签: groovy build.gradle

第19.11节。 4.2.1用户指南是此任务规则示例。在规则被执行之前,if谓词如何能够成为真。我还注意到,在任务规则之前输入任务groupPing时,构建失败。在规则开始之前,pingServer1,pingServer2的任务是如何创建的?

tasks.addRule("Pattern: ping<ID>") { String taskName ->
    if (taskName.startsWith("ping")) {
        task(taskName) {
            doLast {
                println "Pinging: " + (taskName - 'ping')
            }
        }
    }
}

task groupPing {
    dependsOn pingServer1, pingServer2
}

1 个答案:

答案 0 :(得分:2)

根据此book excerpt,该机制类似于Groovy和其他语言中的methodMissing功能。也就是说,如果任务不存在,那么Gradle将故意检查任务规则,这可以清楚地动态创建任务。

要解决此问题,请考虑以下build.gradle

tasks.addRule("rule 1") { String taskName ->
    println "TRACER xyz before if: ${taskName}"
    if (taskName.startsWith("xyz")) {
        println "TRACER xyz inside if: ${taskName}"
        task(taskName) {
            doLast {
                println "xyz " + (taskName - "xyz")
            }
        }
    }
}

tasks.addRule("rule 2") { String taskName ->
    println "TRACER ping before if: ${taskName}"
    if (taskName.startsWith("ping")) {
        println "TRACER ping inside if: ${taskName}"
        task(taskName) {
            doLast {
                println "Pinging: " + (taskName - "ping")
            }
        }
    }
}

task foo {
    println 'foo: config phase'
    doFirst {
        println 'foo: exec phase first'
    }
    doLast {
        println 'foo: exec phase last'
    }
}

task groupPing {
    dependsOn pingServer1, pingServer2
    println 'groupPing: config phase'
}

实质上,这样做:

  • 定义“规则1”,用于检查前缀taskName的{​​{1}}(a String,而不是任务!)
  • 定义“规则2”,检查xyz前缀taskName
  • 使用某些printlns定义任务ping
  • 定义具有动态任务依赖性的任务foo

以下是groupPing的输出(添加了间距)。它说明,在配置阶段,Gradle调用“规则1”,然后调用“规则2”来定义foopingServer1

pingServer2