2015-06-09 16 views
6

Sto imparando Gradle e sto cercando di capire come i file di input e output determinano se un'attività è aggiornata.Ingressi e uscite Gradle

Questa attività non è mai aggiornata, anche quando il file di costruzione non cambia.

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

     doLast { 
      println 'foo' 
     } 
    } 

Questa attività è sempre aggiornata, anche quando il file di costruzione cambia.

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

     doLast { 
      println 'foo' 
     } 
    } 

mi aspettavo entrambi gli esempi di prendere in considerazione il compito di data solo quando il file di build modifiche, e fino ad oggi il contrario. Cosa mi manca?

risposta

5

Gradle necessita di data/ora per input e output per poter determinare se i risultati dell'attività non sono aggiornati.

Nel primo caso non si dispone di timestamp di output perché non si hanno uscite. Gradle non può determinare se le uscite sono aggiornate, perché non le conosce. Quindi considera le tue uscite sempre aggiornate. Dalla documentazione: "Un'attività senza output definiti non sarà mai considerata aggiornata". (https://docs.gradle.org/current/userguide/more_about_tasks.html#sec:up_to_date_checks)

Nel secondo caso Gradle dovrebbe fare ciò che si aspetta: considerare l'output del task scaduto quando il file di costruzione cambia. Dalla documentazione: "Un task con solo output definiti sarà considerato aggiornato se tali output sono invariati rispetto alla build precedente.". Questo potrebbe essere un bug, ma penso che sia dovuto all'utilizzo del file di build come output. Hai provato con un altro file?

+0

Ho eseguito nuovamente il test con diversi file: lo stato è sempre aggiornato quando viene specificato solo l'output. Quando vengono specificati sia input che output, lo stato cambia come previsto (anche quando input e output sono lo stesso file). Ho accettato questa risposta in base alla dichiarazione, "_Gradle ha bisogno di timestamp per input e outputs._" I miei test mostrano che entrambi sono necessari. – jaco0646

+1

Sembra un bug. Ma non ho la minima idea di chi dovrebbe cambiare i file di output e quando farlo, per un compito con solo output da considerare scaduti. Dovresti toccare/cambiare le uscite durante la fase di configurazione di quel compito? La semantica non è chiara secondo me. È meglio specificare sempre input e output per un comportamento affidabile. –

Problemi correlati