web-dev-qa-db-fra.com

Gradle Task for Calling to Order

Je suis en train de faire une tâche qui doit appeler un certain nombre d'autres tâches. 

Voici ce que j'ai

task ci(dependsOn: [
    clean,
    build,
    test
])

Ce qui est étrange est la sortie que je vois:

gradle ci
:compileJava
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:clean             // cleaning after the build
:build
:ci

Notez que le nettoyage a lieu après la cible de génération, ce qui supprime ma génération. 

Si je change de tâche pour:

task ci(dependsOn: [
    clean,
    test
])

Ensuite, il semble exécuter dans le bon ordre:

:clean UP-TO-DATE    // cleaning before the build
:compileJava
:processResources UP-TO-DATE
:classes
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:ci UP-TO-DATE

J'ai essayé de réparer la cible d'origine en ajoutant un build.dependsOn clean, mais cela semble n'avoir aucun effet.

Toute aide est appréciée.

25
dev

Il semble que je sois tombé par hasard sur la question débattue dans le { GRADLE-427 le Guide de l'utilisateur Gradle - Section 15.5 pour établir l'ordre entre les tâches disparates. Ma cible finale ci apparaît ainsi:

task ci(dependsOn: ['clean', 'build', 'uploadArchives'])
build.mustRunAfter clean
uploadArchives.mustRunAfter build

Et tout fonctionne maintenant comme prévu.

39
dev

Version TLDR: Voici comment je l'ai fait dans l'un de mes projets (sans introduire de dépendances artificielles). 

//--- build aliases : define a synonym here if you want a shortcut to run multiple targets

def buildAliases = [
   'all' : ['clean', 'assemble', 'runProvisioner', 'stopTomcat', 'installTomcat', 'deployToTomcat', 'startTomcat'],
   'rebuild' : ['clean', 'assemble']
]
def expandedTaskList = []

gradle.startParameter.taskNames.each {
    expandedTaskList << (buildAliases[it] ? buildAliases[it] : it)
}

gradle.startParameter.taskNames = expandedTaskList.flatten()

println "\n\n\texpanded task list: ${gradle.startParameter.taskNames }\n\n"

Pour utiliser ces alias, appelez-les en tant que tâches. Exemples:

./gradlew all
./gradlew rebuild

ou

gradle all
gradle rebuild

Pour plus d'informations, voir:

https://caffeineinduced.wordpress.com/2015/01/25/run-a-list-of-gradle-tasks-in-specific-order/

9
Lance

Je préférerais ne pas ajouter de tâche d'emballage uniquement pour m'assurer d'une commande.

Dans ce cas, ma solution est la suivante -

run.dependsOn 'clean' compileJava.mustRunAfter 'clean'

Cela garantit que la tâche clean est exécutée avant l'exécution du dégradé compileJava. Tellement efficacement, vous créerez une nouvelle construction tout le temps.

J'espère que cela t'aides.

2
Kunal

En utilisant certaines qualités de Groovy/Gradle, la solution peut être encore améliorée avec les éléments suivants:

def taskNames = [...] // list of task names

task('lastTask', dependsOn: taskNames)

taskNames.inject(null) { acc, val ->
  if (acc != null) tasks[val].mustRunAfter acc
  tasks[val]
}

de cette façon, vous pouvez avoir un endroit avec une liste de tâches.

0
Nikita Skvortsov