我对gradle Action 顺序感到困惑。
这是我的任务如下:
task myTask6 {
description "Here's a task with a configuration block"
group "Some group"
doLast {
println "5"
}
println "2"
leftShift { println "4" }
doFirst {
println "3"
}
}
myTask6 << { println "1" }
我认为结果应该是:
1个
2
3
4
5
但是结果是:
2
3
5
1个
发生了什么?
可以为
leftShift
分配一个闭包吗?因为myTask6.leftShift = {}
是正确的。 最佳答案
解释很容易。首先执行configuration phase行,以便打印 2 。然后,通过(doLast
,doFirst
,<<
)添加的所有 Action 均按添加顺序执行。因此, 3 5 1 将作为输出。 doFirst
将操作添加到列表的开头,而doLast
和leftShift
则添加到列表的末尾。
现在,问题出在哪里:
leftShift { println "4" }
?
问题在于这样一个事实,即
Closure
和 Task
都定义了leftShift
,即使在调用配置闭包时将任务实例设置为委托(delegate)并且使用了DELEGATE_FIRST
解析策略(通过配置闭包,我的意思是在myTask6之后传递的大闭包)文字)Closure
的leftShift
将被调用。要解决该问题,您需要明确定义需要调用的leftShift
:task myTask6 {
description "Here's a task with a configuration block"
group "Some group"
doLast {
println "5"
}
println "2"
it.leftShift { println "4" }
doFirst {
println "3"
}
}
myTask6 << { println "1" }
要么
task myTask6 { t ->
description "Here's a task with a configuration block"
group "Some group"
doLast {
println "5"
}
println "2"
t.leftShift { println "4" }
doFirst {
println "3"
}
}
myTask6 << { println "1" }