Execute task before Android Gradle build?

AndroidGradlebuild.gradleGradle Task

Android Problem Overview


is it possible for Gradle to execute a task before calling

gradle build

Something like precompile. Someone please help. Is something like this possible and how?

Android Solutions


Solution 1 - Android

You can do it in this way:

task build << {
	println 'build'
}
task preBuild << {
    println 'do it before build'
}
build.dependsOn preBuild

Thanks to that task preBuild will be automatically called before build task.

If you want to run preBuild in configuration phase (previous example run preBuild in execution phase) you can do it in this way:

task build << {
	println 'build'
}
build.doFirst {
	println 'do it before build'
}

More about gradle build lifecycle can be read here http://www.gradle.org/docs/current/userguide/build_lifecycle.html.

Solution 2 - Android

For those who are wondering how to do this in an Android project, this worked for me:

task myTask << {
  println "here's a task"
}
preBuild.dependsOn myTask

Solution 3 - Android

There is one more way how to do this

task myTask << {
    println "here's a task"
}
tasks.whenTaskAdded { task ->
if (task.name == 'assembleDebug') {
    task.dependsOn myTask 
}

Solution 4 - Android

The left shift operator << was removed in Gradle 5.

In my case I had an Android project using a Java sub project and this worked:

task myTask {
    doLast {
        println 'do it before build'
    }
}

assemble.dependsOn myTask

Regarding the initial question this should be the syntax now:

task myTask {
    doLast {
        println 'do it before build'
    }
}
build.dependsOn myTask
// or for Android
preBuild.dependsOn myTask

Solution 5 - Android

In Gradle 5.4.x

// File: app/build.gradle
// See: https://docs.gradle.org/current/dsl/org.gradle.api.tasks.Exec.html
task ruby(type:Exec) {
    workingDir '../'
    executable = '/usr/bin/env'
    args = ["ruby", "--version"]
}
preBuild.dependsOn ruby

Solution 6 - Android

If the task to be run is already defined (for example publishToMavenLocal), you can add it into your gradle build task with:

build.dependsOn publishToMavenLocal

Solution 7 - Android

This is Kotlin DSL (build.gradle.kts) equivalent of k_o_'s answer:

tasks.create("MyTask") {
    doLast {
        println("I am the task MyTask")
    }
}

tasks.build {
    dependsOn("MyTask")
}

// OR another notation
// tasks.named("build") {
//     dependsOn(tasks["MyTask"])
// }

For more information see Gradle documentation: Adding dependencies to a task.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionHellOfACodeView Question on Stackoverflow
Solution 1 - AndroidpepuchView Answer on Stackoverflow
Solution 2 - AndroidnlawsonView Answer on Stackoverflow
Solution 3 - AndroidVolodymyrView Answer on Stackoverflow
Solution 4 - Androidk_o_View Answer on Stackoverflow
Solution 5 - AndroidVladView Answer on Stackoverflow
Solution 6 - AndroidBen WatsonView Answer on Stackoverflow
Solution 7 - AndroidMahozadView Answer on Stackoverflow