Tarea personalizada de Gradle que ejecuta múltiples tareas

81

Quiero ejecutar varias tareas de Gradle como una. Entonces en lugar de

./gradlew clean build publish

Quiero tener una tarea personalizada

./gradlew cleanBuildPublish

que se ejecuta clean buildy publishen orden.

¿Como es eso posible?

Esto no funciona

task cleanBuildPublish {
    dependsOn 'clean'
    dependsOn 'build'
    dependsOn 'publish'
}
Niklas
fuente
¿Está utilizando el complemento de Java?
Santosh Gokak
@SantoshGokak sí, quiero
Niklas

Respuestas:

113

Si necesita ejecutar algunas tareas en un orden predefinido, no solo debe establecer dependsOn, sino también establecer la mustRunAfterpropiedad para estas tareas, como en el siguiente código:

task cleanBuildPublish {
    dependsOn 'clean'
    dependsOn 'build'
    dependsOn 'publish'
    tasks.findByName('build').mustRunAfter 'clean'
    tasks.findByName('publish').mustRunAfter 'build'
}

dependsOnno define un orden de ejecución de tareas, solo hace que una tarea dependa de otra, mientras que lo mustRunAfterhace.

Stanislav
fuente
¿Con eso todavía sería posible ejecutar las tareas únicamente?
Niklas
17
Recibo este errorCannot invoke method mustRunAfter() on null object
Niklas
1
una más, su tarea cleanBuildPublish debe colocarse después de las 3 tareas dependientes en su script de compilación
Stanislav
1
Asegúrese de poner cleanBuildPublishdespués de que se hayan definido todas las tareas individuales. Parece que las tareas de Gradle se leen de arriba a abajo. Eso resolvió mi problema paraCannot invoke method mustRunAfter() on null object
baskInEminence
2
Es importante mencionar que gradle no espera a que termine la tarea
MontrealDevOne
96

También puede utilizar la clase base de tareas llamada GradleBuild

Aquí cómo puedes hacer eso con GradleBuild

task cleanBuildPublish(type: GradleBuild) {
     tasks = ['clean', 'build', 'publish']
}
tasomaniac
fuente
1
¿Entonces la tarea se ejecutará en la secuencia mencionada?
Mangesh Kadam
1
versión kotlin de la misma?
Mani
La versión de Kotlin sería muy similar. Solo desea usar project.tasks.registerpara crear su tarea y eso es todo.
tasomaniac
8
El proyecto Gradle recomienda específicamente no hacer esto: docs.gradle.org/current/userguide/…
Alex
4

Si la tarea de publicación está en un subproyecto llamado subProjectName,

...
tasks.findByPath(':subProjectName:publish').mustRunAfter 'build'
...
Asanka
fuente
3

Pruebe la siguiente forma de hacer que cleanBuildPublish dependa de otras tareas

build.gradle

task clean{
    println "lets clean"
}

task build {
    println "lets build"
}

task publish {
    println "lets publish"
}

task cleanBuildPublish{
    println 'lets do all'
}


cleanBuildPublish.dependsOn clean
cleanBuildPublish.dependsOn build
cleanBuildPublish.dependsOn publish

Salida

$ gradle cleanBuildPublish
lets clean
lets build
lets publish
lets do all
:build UP-TO-DATE
:clean UP-TO-DATE
:publish UP-TO-DATE
:cleanBuildPublish UP-TO-DATE

BUILD SUCCESSFUL

Total time: 2.738 secs

consulte https://docs.gradle.org/current/userguide/more_about_tasks.html#addDependencyUsingTask para obtener más detalles

Santosh Gokak
fuente
1
Todavía no lo hace. Salida: pastebin.com/8knNfLEY Tarea de Gradle pastebin.com/NaHhdRkA
Niklas
Por favor comparta su archivo build.gradle
Santosh Gokak
Proyecto: pastebin.com/4uN9Usvd Módulo de calendario: pastebin.com/CPzYKNqx Publishing.gradle pastebin.com/XMMQUG4C
Niklas
2

Mi enfoque es

task cleanBuildPublish (type: GradleBuild, dependsOn: ['clean', 'build', 'publish']) { 
}

Esto funciona para mi.

Codev
fuente
2
El proyecto Gradle recomienda específicamente no hacer esto: docs.gradle.org/current/userguide/…
Alex
0

Así es como lo hice, con la secuencia de comandos de Kotlin, usando depende de cómo y debeRunAfter. A continuación, se muestra un ejemplo de ejecución de dos tareas, una (tarea "importUnicodeFiles" registrada personalizada) que se encuentra en "este" proyecto y otra (tarea "ejecución" predefinida) que está en un proyecto hermano llamado ": unicode":

tasks.register("rebuildUnicodeFiles") {
    description = "Force the rebuild of the `./src/main/resources/text` data"
    val make = project(":unicode").tasks["run"]
    val copy = tasks["importUnicodeFiles"]
    dependsOn(make)
    dependsOn(copy)
    copy.mustRunAfter(make)
}

Los desarrolladores de Gradle generalmente desaconsejan este enfoque (dicen que forzar el pedido es malo y que ejecutar tareas de otros proyectos es malo), y están trabajando en una forma de publicar resultados entre proyectos; ver: https://docs.gradle.org/current/userguide/cross_project_publications.html

cpurdy
fuente
-1

Así es como lo hice, con la secuencia de comandos de Kotlin, usando depende de cómo y debeRunAfter. A continuación, se muestra un ejemplo de ejecución de dos tareas, una (tarea "importUnicodeFiles" registrada personalizada) que se encuentra en "este" proyecto y otra (tarea "ejecución" predefinida) que está en un proyecto hermano llamado ": unicode":

tasks.register("rebuildUnicodeFiles") {
    description = "Force the rebuild of the `./src/main/resources/text` data"
    val make = project(":unicode").tasks["run"]
    val copy = tasks["importUnicodeFiles"]
    dependsOn(make)
    dependsOn(copy)
    copy.mustRunAfter(make)
}
cpurdy
fuente
-3

Intente agregar defaultTasksbuild.gradle. Por ej. defaultTasks 'clean', 'build', 'publish'

Sumit Pal Singh
fuente