How to force task execution order in gradle 6.7.1

Viewed 22

I am making a gradle script that must execute tasks in a specific order.

Despite looking that this forum post and this documentation, I do not understand how I am supposed to force task execution order.

I have this very complicated script:

task copyProjectTemplate(type: Copy) {
    doLast {
        println("copoying")
    }
    // from project_template_path_internal
    // into project_path
}

task createProject {
    mustRunAfter copyProjectTemplate
    doLast {
        println("project has been created")
    }
}

When executed with gradle -b create_project.gradle createProject, only the createProject task is executed.

Using the following alternative has the same behaviour:

task copyProjectTemplate(type: Copy) {
    doLast {
        println("copoying")
    }
    // from project_template_path_internal
    // into project_path
}

task createProject {
    doLast {
        println("project has been created")
    }
}

createProject.mustRunAfter copyProjectTemplate

The output in both cases is:

$ gradle -b create_project.gradle createProject

> Task :createProject   
project has been created

BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed

How can I force task execution order ?


Edit 1:

Using the documentation sample, I realise that the Copy type seems to "break" (or not work as I expect it) things.

For example:

task createProject {
    doLast {
        println 'createProject'
    }
}
task copyTemplate() {
    doLast {
        println 'copyTemplate'
    }
}
task taskZ {
    doLast {
        println 'taskZ'
    }
}
createProject.dependsOn copyTemplate
copyTemplate.dependsOn taskZ

>gradle -b create_project.gradle createProject

Executes the task in order:

$ gradle -b create_project.gradle createProject

> Task :taskZ
taskZ

> Task :copyTemplate
copyTemplate

> Task :createProject
createProject

BUILD SUCCESSFUL in 1s
3 actionable tasks: 3 executed

But:

task createProject {
    doLast {
        println 'createProject'
    }
}
task copyTemplate(type: Copy) {
    doLast {
        println 'copyTemplate'
    }
}
task taskZ {
    doLast {
        println 'taskZ'
    }
}
createProject.dependsOn copyTemplate
copyTemplate.dependsOn taskZ

>gradle -b create_project.gradle createProject

Does not execute copyTemplate:

$ gradle -b create_project.gradle createProject

> Task :taskZ
taskZ

> Task :createProject
createProject

BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 executed

Why is that ?

Edit 2:

With actual copy commands (from into), the task is executed "correctly":

task createProject {
    doLast {
        println 'createProject'
    }
}
task copyTemplate(type: Copy) {
    doFirst {
        println "first copy ?"
    }
    doLast {
        println 'last copy ?'
    }
    from "./README.md"
    into "./yolo_project/"
}
task taskZ {
    doLast {
        println 'taskZ'
    }
}

Output:

$ gradle -b create_project.gradle createProject

> Task :taskZ
taskZ

> Task :copyTemplate
first copy ?        
last copy ?

> Task :createProject
createProject

BUILD SUCCESSFUL in 1s
3 actionable tasks: 3 executed

Could someone explain me why in "non copy typed" tasks, doLast and doFirst are considered as actions (or at least are actually printed) but not for the "copy typed" task, that seems to need the from and into instructios ?

0 Answers
Related