第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
}
答案 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'
}
实质上,这样做:
taskName
的{{1}}(a String
,而不是任务!)xyz
前缀taskName
ping
foo
以下是groupPing
的输出(添加了间距)。它说明,在配置阶段,Gradle调用“规则1”,然后调用“规则2”来定义foo
和pingServer1
:
pingServer2