Dynamisch erstellte Aufgabe vom Typ Kopie ist immer AKTUALISIERT

8

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 :

%Vor%

auf diese Weise werden meine Aufgaben nicht ausgeführt, wenn ich die Standardaufgabe aufrufen, indem ich einfach gradle :

aufruft %Vor%

Wenn ich den Typ Copy von meiner dynamischen Aufgabe entferne (die Zeile oben auskommentieren), werden meine Aufgaben ausgeführt:

%Vor%

(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,

hinzuzufügen %Vor%

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.

    
Sergey Shcherbakov 27.11.2013, 17:30
quelle

4 Antworten

10

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 .

Die Blöcke

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.

    
Peter Niederwieser 27.11.2013, 22:08
quelle
2

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.

    
Sergey Shcherbakov 27.11.2013 19:05
quelle
2

Nach dem Lesen der meisten Antworten auf "UP-TO-DATE" Kopieren von Aufgaben in Großbuchstaben scheint der fehlende Teil das Schlüsselwort "include" zu sein:

%Vor%     
Tosha 23.03.2016 17:50
quelle
0

Das Einfügen von from und into als Teil des Abschnitts doLast funktioniert nicht. Ein Beispiel für eine Arbeitsaufgabe Definitionen ist:

%Vor%

Nicht das Verhalten, das ich erwartet habe. Verwenden von Gradle 3.2.1

    
Miguel 01.12.2016 18:08
quelle

Tags und Links