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.