web-dev-qa-db-fra.com

Appeler une autre tâche à partir d'une tâche en grappe

J'utilise Gradle. J'ai deux tâches: "a" et "b". Je veux la tâche "a" pour appeler la tâche "b". Comment puis-je faire ceci?

task b(type: Exec) {
    description "Task B"
    commandLine 'echo', 'task-b'
}

task a(type: Exec) {
    description "Task A"
    commandLine 'echo', 'task-a'
    // TODO: run task b
}

Dans Ant c'est un morceau de gâteau:

<target name="a">
    <echo message="task-a"/>
    <antcall target="b"/>
</target>
<target name="b">
    <echo message="task-b"/>
</target>

La première méthode que j'ai essayée utilise la fonctionnalité "dependOn". Cependant, ceci n’est pas idéal car nous aurions besoin de penser toutes les tâches à l’inverse et nous avons également plusieurs autres problèmes (comme exécuter une tâche quand une condition est remplie).

Une autre méthode que j'ai essayée est:

b.mustRunAfter(a)

Cependant, cela ne fonctionne que si je lance les tâches de gradle comme ceci:

gradle -q a b

Ce qui n'est pas idéal non plus. 

Y a-t-il un moyen d'appeler simplement une autre tâche à partir d'une tâche existante?

14
Yahya Uddin

Comme suggéré, une méthode consisterait à ajouter un finaliseur pour la tâche.

task beta << {
    println 'Hello from beta'
}

task alpha << {
    println "Hello from alpha"
}

// some condition
if (project.hasProperty("doBeta")) {
    alpha.finalizedBy beta
}

Ensuite, nous pouvons exécuter l'autre tâche si nécessaire. En ce qui concerne l'exécution de tâches à partir d'autres tâches, vous ne pouvez pas le faire. La déclaration de tâche est déclarative et non impérative. Une tâche peut donc dépendre d'une autre tâche, mais ils ne peuvent pas en exécuter une autre.

$ gradle -q alpha
Hello from alpha
$ gradle -q alpha -PdoBeta
Hello from alpha
Hello from beta
14
JBirdVegas

Pour résumer et combiner les réponses de @JBirdVegas et de @ lance-Java, en utilisant doLast non obsolète au lieu de leftShift (<<):

task beta {
    doLast {
        println 'Hello from beta'
    }
}

task alpha {
    doLast {
        println 'Hello from alpha'
    }
}

// some condition
if (project.hasProperty('doBeta')) {
    alpha.finalizedBy beta // run 'beta' after 'alpha'
    // or
    // alpha.dependsOn beta // run 'beta' before 'alpha'
}
9
friederbluemle

Vous pouvez utiliser

a.dependsOn 'b'

Ou

a.dependsOn b

Ou

task a(type: Exec, dependsOn: 'b') { ... }

etc

Voir ajout de dépendances aux tâches

9
lance-java

Il fonctionne bien mais fournit un avertissement car des fonctionnalités obsolètes de Gradle ont été utilisées dans cette version, le rendant incompatible avec Gradle 5.0.

 enter imagGradleription here

J'utilise gradle version 4.7. Cela signifie donc que certaines des fonctionnalités que vous avez ajoutées dans le fichier build.gradle ne fonctionneront pas comme dans la version 5.0.

Exécutez la construction Gradle avec un argument de ligne de commande --warning-mode = all pour voir ce que sont exactement les fonctionnalités obsolètes.

Il vous donnera une description détaillée des problèmes trouvés avec des liens vers la documentation Gradle pour des instructions sur la façon de réparer votre build.

1
Deepak Bhavale