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

¿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.


¿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']
}

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'
...

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


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


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


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

-3

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.