Ich habe ein sehr einfaches Skript vorbereitet, das das Problem darstellt, das ich bei der Verwendung von Gradle 1.7 sehe (muss bei einigen Plugins bleiben, die neuere Versionen noch nicht unterstützen).
Ich versuche dynamisch Aufgaben zu erstellen, von denen jede einer Datei im Projektverzeichnis entspricht. Das funktioniert gut, aber die Aufgaben, die ich erstelle, werden nie ausgeführt, sobald ich ihnen den Typ 'Kopieren' gebe.
Hier ist mein Problem build.gradle
:
auf diese Weise werden meine Aufgaben nicht ausgeführt, wenn ich die Standardaufgabe aufrufen, indem ich einfach gradle
:
Wenn ich den Typ Copy
von meiner dynamischen Aufgabe entferne (die Zeile oben auskommentieren), werden meine Aufgaben ausgeführt:
(Sie müssen einen Ordnernamen templates
in demselben Verzeichnis erstellen, in dem sich build.gradle
befindet, und einige leere Dateien dort einfügen, um den Test auszuführen)
Entsprechend der Debug-Ausgabe:
Überspring-Task ': myDist-template1', da keine Quelldateien vorhanden sind.
Springtask ': myDist-template2', da keine Quelldateien vorhanden sind.
Wie kann ich Quelldateien angeben und meine Copy
Aufgaben ausführen lassen?
Ich habe versucht,
an den Task body, ich habe versucht, Task inputs.source file('/my/existing/file')
ohne Erfolg zuweisen.
Könnten Sie mir bitte mitteilen, wie Sie mein einfaches Skript ändern können, indem Sie dynamische Aufgaben erstellen und meine dynamischen Aufgaben vom Typ Copy
beibehalten?
Danke!
Bearbeiten: OK, auf diese Weise wird die Aufgabe aufgerufen:
%Vor% aber es sieht so aus, dass ich immer from
/ into
angeben muss. Es ist nicht ausreichend, dies im doLast {} -Body zu tun.
Eine Copy
Aufgabe wird nur ausgeführt, wenn sie etwas zu kopieren hat. Zu sagen, was kopiert werden soll, ist Teil der Konfiguration der Aufgabe und muss daher in der Konfigurationsphase statt in der Ausführungsphase erfolgen. Dies sind sehr wichtige Konzepte zu verstehen, und Sie können sie in der Gradle Benutzerhandbuch oder auf die Gradle-Foren .
doFirst
und doLast
werden in der Ausführungsphase als Teil der Ausführung der Aufgabe ausgeführt. Beide sind zu spät, um der Aufgabe mitzuteilen, was kopiert werden soll: doFirst
wird unmittelbar vor der Aktion der Hauptaufgabe (in diesem Fall das Kopieren) ausgeführt, aber (kurz) nach den Prüfungen skipped
und up-to-date
(die basierend auf der Konfiguration der Aufgabe). doLast
wird nach der Hauptaufgabenaktion ausgeführt und ist daher eindeutig zu spät.
Ich denke, das folgende Benutzerhandbuch von Gradle User Guide beantwortet meine Frage am besten:
>Zweitens kann die Methode copy () keine Aufgabenabhängigkeiten berücksichtigen, wenn eine Aufgabe als Kopierquelle verwendet wird (d. h. als Argument von from ()), da es sich um eine Methode und nicht um eine Aufgabe handelt. Wenn Sie also die Methode copy () als Teil einer Taskaktion verwenden, müssen Sie explizit alle Eingaben und Ausgaben deklarieren, um das richtige Verhalten zu erhalten.
Tags und Links gradle build.gradle