我对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 。然后,通过(doLastdoFirst<<)添加的所有 Action 均按添加顺序执行。因此, 3 5 1 将作为输出。 doFirst将操作添加到列表的开头,而doLastleftShift则添加到列表的末尾。

现在,问题出在哪里:

leftShift { println "4" }



问题在于这样一个事实,即 Closure Task 都定义了leftShift,即使在调用配置闭包时将任务实例设置为委托(delegate)并且使用了DELEGATE_FIRST解析策略(通过配置闭包,我的意思是在myTask6之后传递的大闭包)文字)ClosureleftShift将被调用。要解决该问题,您需要明确定义需要调用的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" }

08-05 11:42