2017-02-19 3 views
1

Ich habe ein benutzerdefiniertes Gradle-Plugin, das Java-Dateien aus einer Vorlagendatei generiert. Ich habe mehrere solche Vorlagendateien an verschiedenen Orten, und ich muss sie alle "kompilieren", um die Java-Dateien zu generieren, die ich brauche. Sobald ich die Dateien habe, möchte ich sie in ein .jar verpacken.Alternative zum Aufrufen einer Task aus einer Task, Gradle

Mein erster Gedanke war, dass ich die Aufgabe "kompilieren" aus dem benutzerdefinierten Plugin von anderen Aufgaben ausführen würde. Etwas wie:

task compileFromLocationA <<{ 
    compileTemplate.execute()... 
} 

task compileFromLocationB 
    ... 

packageJar(depends: compileFromLocationA, compileFromLocationB) 
    ... 

Sie können jedoch nicht programmgesteuert eine Aufgabe innerhalb einer anderen Aufgabe aufrufen. Ich habe gehört, dass ich in der Lage sein könnte, mit dependsOn oder finalizedBy umgehen, aber ich bin nicht in der Lage, herauszufinden, wie Sie diese Schlüsselwörter hier anwenden. Was ist die "Best Practice" für so etwas? Ich bin neu bei Gradle und konnte mit den offiziellen Dokumenten nicht sehr weit kommen.

Antwort

2

Sie können dazu dependsOn verwenden. Hier ist ein Beispiel:

apply plugin: 'java' 

task taskA <<{ 
    println 'task A' 
} 

task taskB (type:Copy){ 
    println 'B' 
} 

task taskC (type:Copy){ 
    println 'C' 
} 
task taskBC (dependsOn:['taskB','taskC'])<<{ 
    println 'BC' 
} 
taskBC.mustRunAfter taskA 

Sie auch mustRunAfter können eine Aufgabe, immer nach der anderen Aufgabe ausgeführt wird, um sicherzustellen.

+0

Es ist mir noch nicht klar, wie ich dieses Muster auf, sagen wir nutzen könnten, laufen Taska mehr als einmal. Ich muss die Aufgabe "Vorlage kompilieren" mehrmals ausführen. – Adam

+0

Zum Zeitpunkt dieses Kommentars gab es keinen Hinweis auf "mehr als einmal ausführen" – pczeus

+0

"Ich würde die Aufgabe" kompilieren "aus dem benutzerdefinierten Plugin aus anderen Aufgaben * s * ausführen". Ich werde das bearbeiten, um das klarer zu machen. – Adam

1

können Sie haben:

1) Einige Funktionen in "normalen" Groovy Funktionen verpackt:

def doSomething() { 
    // ... 
} 

task taskA { 
    description = 'Description for this task' 
    doLast { 
    doSomething() 
    } 
} 

2) Nutzen Sie mustRunAfter zwischen Aufgaben (Vorsicht, kann diese chaotisch geworden , abhängig von Ihrer Konfiggröße)

task taskA { 
    description = 'Description for task A' 
    doLast { 
    // ... 
    } 
} 

task taskB { 
    description = 'Description for task B' 
    doLast { 
    // ... 
    } 
} 

taskB.mustRunAfter taskA 

3) Nutzen Sie dependsOn zwischen Aufgaben

task taskA { 
    description = 'Description for task A' 
    doLast { 
    // ... 
    } 
} 

task taskB(dependsOn: taskA) { 
    description = 'Description for task B' 
    doLast { 
    // ... 
    } 
} 
+0

Also könnte ich die "compile the template file" -Logik innerhalb von 'doSomething()' haben? Ich kann sehen, wie das funktionieren würde, obwohl ich die Idee mag, die Kompilierungslogik in einem separaten Plugin zu behalten, damit ich es leichter wiederverwenden kann. – Adam

+0

Es ist mir immer noch nicht klar, wie ich dieses Muster verwenden könnte, um TaskA mehr als einmal auszuführen. Ich muss die Aufgabe "Vorlage kompilieren" mehrmals ausführen. – Adam

Verwandte Themen