web-dev-qa-db-fra.com

Exécuter la tâche gradle sur les sous-projets

J'ai un projet Gradle MultiModule que j'essaie de configurer.

Root
    projA
    projB
    other
        projC
        projD
        projE
        ...

Je veux pouvoir faire est d'avoir une tâche dans la racine build.gradle qui exécutera la tâche buildJar dans chacun des projets de l'autre répertoire.

Je sais que je peux faire

configure(subprojects.findAll {it.name != 'tropicalFish'}) {
    task hello << { task -> println "$task.project.name"}
}

Mais cela obtiendra également projA et projB, je veux exécuter la tâche uniquement sur c, d, e ... Veuillez me faire savoir la meilleure façon d'y parvenir.

39
Nathan Case

Je ne sais pas exactement lequel de ces éléments vous recherchez, mais ils devraient couvrir vos bases.

1. Appel direct des tâches

Vous devriez juste pouvoir appeler

gradle :other/projC:hello :other/projD:hello

J'ai testé cela avec:

# Root/build.gradle
allprojects {
    task hello << { task -> println "$task.project.name" }
}

et

# Root/settings.gradle
include 'projA'
include 'projB'
include 'other/projC'
include 'other/projD'

2. Création de tâches uniquement dans les sous-projets

Ou est-ce que vous voulez seulement que la tâche soit créée sur les autres projets/*?

Si ce dernier, alors les travaux suivants:

# Root/build.gradle
allprojects {
    if (project.name.startsWith("other/")) {
        task hello << { task -> println "$task.project.name" }
    }
}

et il peut ensuite être appelé avec:

$ gradle hello
:other/projC:hello
other/projC
:other/projD:hello
other/projD

. Création d'une tâche qui exécute des tâches dans les sous-projets uniquement

Cette version correspond à ma lecture de votre question, ce qui signifie qu'il y a déjà une tâche sur les sous-projets (buildJar), ​​et la création d'une tâche en racine qui appellera uniquement les sous-projets other/*: buildJar

allprojects {
    task buildJar << { task -> println "$task.project.name" }
    if (project.name.startsWith("other/")) {
        task runBuildJar(dependsOn: buildJar) {}
    }
}

Cela crée une tâche "buildJar" sur chaque projet et "runBuildJar" sur les autres projets/* uniquement, vous pouvez donc appeler:

$ gradle runBuildJar
:other/projC:buildJar
other/projC
:other/projC:runBuildJar
:other/projD:buildJar
other/projD
:other/projD:runBuildJar

Votre question peut être lue de plusieurs façons, j'espère que cela les couvre toutes :)

48
Mark Fisher

J'ai trouvé cette question aujourd'hui parce que j'ai le même problème. Tous les moyens mentionnés par Mark peuvent être utilisés, mais tous ont des inconvénients. J'ajoute donc une option de plus:

4. Changement de projet en cours

gradle -p other hello

Cela commute le "projet en cours", puis exécute toutes les tâches nommées hello sous le projet en cours.

38
Marwin