2015-06-09 11 views
6

Ich lerne Gradle und versuche zu verstehen, wie Eingabe- und Ausgabedateien bestimmen, ob eine Aufgabe aktuell ist.Gradle Ein- und Ausgänge

Diese Aufgabe ist nie aktuell, auch wenn sich die Build-Datei nicht ändert.

task printFoo() { 
     inputs.file(getBuildFile()) 

     doLast { 
      println 'foo' 
     } 
    } 

Diese Aufgabe ist immer aktuell, auch wenn sich die Build-Datei ändert.

Ich hatte erwartet, dass beide Beispiele die Aufgabe nur veraltet betrachten, wenn sich die Build-Datei ändert, und ansonsten auf dem neuesten Stand. Was vermisse ich?

Antwort

5

Gradle benötigt Zeitstempel für Eingaben und Ausgaben, um feststellen zu können, ob die Aufgabenergebnisse veraltet sind.

Im ersten Fall haben Sie keine Ausgabezeitstempel, weil Sie keine Ausgaben haben. Gradle kann nicht feststellen, ob Ihre Ausgaben aktuell sind, weil sie sie nicht kennen. Daher sind Ihre Ausgaben immer veraltet. Aus der Dokumentation: "Eine Aufgabe ohne definierte Ausgaben wird nie als aktuell angesehen." (https://docs.gradle.org/current/userguide/more_about_tasks.html#sec:up_to_date_checks)

Im zweiten Fall sollte Gradle tun, was Sie erwarten: Betrachten Sie die Task-Ausgaben veraltet, wenn die Build-Datei ändert. Aus der Dokumentation: "Eine Task mit nur definierten Outputs wird als aktuell betrachtet, wenn diese Outputs seit dem letzten Build unverändert sind." Dies könnte ein Fehler sein, aber ich denke, es liegt daran, dass Sie die Build-Datei als Ausgabe verwenden. Hast du es mit einer anderen Datei versucht?

+0

Ich habe erneut mit mehreren Dateien getestet: Status ist immer aktuell, wenn nur die Ausgabe angegeben ist. Wenn sowohl Eingabe als auch Ausgabe angegeben sind, ändert sich der Status wie erwartet (auch wenn Eingabe und Ausgabe dieselbe Datei sind). Ich habe diese Antwort basierend auf der Aussage akzeptiert: "_Gradle benötigt Zeitstempel für Eingaben und Ausgaben._" Meine Tests zeigen, dass beide benötigt werden. – jaco0646

+1

Es klingt wie ein Fehler. Aber ich habe keine Ahnung, wer die Ausgabedateien ändern sollte und wann dies zu tun ist, für eine Aufgabe, bei der nur Ausgaben als veraltet angesehen werden. Sollten Sie während der Konfigurationsphase dieser Aufgabe die Ausgänge berühren/ändern? Die Semantik ist meiner Meinung nach nicht klar. Es empfiehlt sich, immer Ein- und Ausgänge für zuverlässiges Verhalten anzugeben. –