Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gradle custom task action order

Tags:

gradle

task

I'm looking at a simple example of a custom task in a Gradle build file from Mastering Gradle by Mainak Mitra (page 70). The build script is:

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 "}

If I run the build script with gradle -q :hello, the output is:

Executing first statement 
System Name is MyDevelopmentMachine and group is Development
Adding multiple actions for refactoring
Executing last statement 

As expected with the doFirst method excecuting first, the two custom actions executing in the order in which they were defined, then the doLast action executing. If I comment out the lines adding the doFirst and doLast actions, the output is:

Adding multiple actions for refactoring
System Name is MyDevelopmentMachine and group is Development

The custom actions are now executing in the reverse order in which they are defined. I'm not sure why.

like image 595
Mike HT Avatar asked Jun 01 '17 00:06

Mike HT


1 Answers

I think it's simply a case that the ordering is not deterministic, and you get different results depending on how you further configure the task.

Why do you want 2 separate @TaskAction methods as opposed to a single one that calls methods in a deterministic sequence, though ? I can't think of a particular advantage of doing it that way (I realize it's from a sample given in a book). Most other samples I find only have a single method

@TaskAction 
void execute() {...} 

which I think makes more sense and be more predictable.

like image 189
Patrice M. Avatar answered Oct 19 '22 01:10

Patrice M.