2014-10-22 5 views
26

Ich habe ein MultiModule-Projekt, das ich zu konfigurieren versuche.Führen Sie die Task "gradle" für Unterprojekte aus

Root 
    projA 
    projB 
    other 
     projC 
     projD 
     projE 
     ... 

Wollen Ich will eine Aufgabe in der Wurzel build.gradle tun können, ist haben, die die buildJar Aufgabe in jedem der Projekte im anderen Verzeichnis ausgeführt wird.

Ich weiß, ich

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

Aber dies wird auch erhalten projA und projB, möchte ich die Aufgabe auf c, d, e nur laufen ... Bitte lassen Sie mich die beste Art und Weise kennen zu Dies erreichen.

Antwort

32

Nicht ganz sicher, welche von denen Sie suchen, aber sie sollten Ihre Basen abdecken.

1. die Aufgaben Aufruf direkt

Sie sollten nur in der Lage sein zu nennen

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

Getestet habe ich diese mit:

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

und

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

2. Nur Aufgaben in den Unterprojekten

Schaffung Oder ist es, dass Sie nur die Aufgabe, auf der anderen Seite/* Projekte erstellt werden soll?

Wenn letzteres, dann sind die folgenden Werke:

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

und es kann dann mit aufgerufen werden:

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

3. Erstellen einer Aufgabe, die Aufgaben in den Teilprojekten läuft nur

Diese Version stimmt mit dem Lesen Ihrer Frage überein, was bedeutet, dass es bereits eine Aufgabe für die Teilprojekte (buildJar) gibt, und erstellen Sie eine Aufgabe in Wurzel, die die Teilprojekte nur nennen andere/*: buildJar

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

Dies schafft eine Aufgabe „buildJar“ bei jedem Projekt, und „runBuildJar“ auf der anderen Seite/* Projekte nur, so können Sie anrufen:

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

Ihre Frage können viele Arten gelesen werden, hoffen, dass dies deckt sie alle :)

+0

Danke für die Antwort. Keine der Optionen entspricht meinen Bedürfnissen: 1. Wir müssen die Liste aller Teilprojekte kennen. 2 + 3. Build-Skript muss geändert werden. Schließlich habe ich einen anderen Weg gefunden, dies zu erreichen, und es als neue Antwort hinzugefügt. – Marwin

+0

@Marwin: Wo ist deine Antwort? Würde mich interessieren. – frhd

+0

@frhd Siehe die Antwort unter meinem 'Gradle -p anderen Hallo' –

22

ich diese Frage heute gefunden, weil ich das gleiche Problem haben. Alle von Mark erwähnten Wege können benutzt werden, aber alle haben einige Nachteile. Also füge ich eine weitere Option hinzu:

4.das aktuelle Projekt Schalt

gradle -p other hello 

Diese schalten das „aktuelle Projekt“ und führt dann alle Aufgaben hello unter dem aktuellen Projekt benannt.

Verwandte Themen