Gradle自定义任务操作顺序

Mik*_* HT 5 task gradle

我正在看Mainak Mitra撰写的Mastering Gradle的Gradle构建文件中的自定义任务的简单示例(第70页)。构建脚本为:

println "Working on custom task in build script"

class SampleTask extends DefaultTask {
    String systemName = "DefaultMachineName"
    String systemGroup = "DefaultSystemGroup"
    @TaskAction
    def action1() {
      println "System Name is "+systemName+" and group is "+systemGroup 
    }
    @TaskAction
    def action2() {
      println 'Adding multiple actions for refactoring'
    }

}

task hello(type: SampleTask)
hello {
    systemName='MyDevelopmentMachine'
    systemGroup='Development'
}

hello.doFirst {println "Executing first statement "} 
hello.doLast {println "Executing last statement "}
Run Code Online (Sandbox Code Playgroud)

如果我使用gradle -q:hello运行构建脚本,则输出为:

Executing first statement 
System Name is MyDevelopmentMachine and group is Development
Adding multiple actions for refactoring
Executing last statement 
Run Code Online (Sandbox Code Playgroud)

如预期的那样,首先执行doFirst方法,两个自定义动作将按照定义它们的顺序执行,然后执行doLast动作。如果我注释掉添加doFirst和doLast操作的行,则输出为:

Adding multiple actions for refactoring
System Name is MyDevelopmentMachine and group is Development
Run Code Online (Sandbox Code Playgroud)

现在,自定义动作以与定义它们相反的顺序执行。我不知道为什么。

Pat*_* M. 5

我认为这只是排序不确定的一种情况,根据您进一步配置任务的方式,您会得到不同的结果。

但是,为什么您需要 2 个单独的 @TaskAction 方法,而不是一个以确定性顺序调用方法的方法?我想不出这样做有什么特别的好处(我意识到它来自书中给出的样本)。我发现的大多数其他样本只有一种方法

@TaskAction 
void execute() {...} 
Run Code Online (Sandbox Code Playgroud)

我认为这更有意义,也更容易预测。