Vorrei aprire il file di report di alcuni dei plugin "check" e "test" che utilizzo quando un controllo fallisce. So che ho can use "finalizedBy per eseguire un'altra attività, indipendentemente dal fatto che l'attività originale sia stata eseguita. Usando questa conoscenza ho provato quanto segue per aprire il report solo se l'attività corrispondente (in questo esempio checkstyle
) fallisce:Gradle: esegue un'azione solo se un'operazione fallisce
task showCheckStyleResultsInBrowser(type: Exec) {
ext.htmlFileName = "main.html"
executable 'open'
args 'file:///' + checkstyleMain.reports.xml.destination.parent + "/" + ext.htmlFileName
}
task showCheckStyleResultsIfFailed {
ext.aCheckFailed = true
doLast {
if (ext.aCheckFailed) {
showCheckStyleResultsInBrowser.execute()
}
}
}
checkstyleMain {
finalizedBy 'showCheckStyleResultsIfFailed'
doLast {
// convert the xml output to html via https://stackoverflow.com/questions/20361942/generate-checkstyle-html-report-with-gradle
ant.xslt(in: reports.xml.destination,
style: new File('config/checkstyle/checkstyle-noframes-sorted.xsl'),
out: new File(reports.xml.destination.parent, showCheckStyleResultsInBrowser.htmlFileName))
showCheckStyleResultsIfFailed.aCheckFailed = false
}
}
Spiegazione (per quanto ho capito):
showCheckStyleResultsInBrowser
ist il compito che in realtà fa l'apertura del rapporto. È possibile ignorare ciò che effettivamente fa, ma è quello che dovrebbe essere eseguito se l'attività di controllo non riesce- L'attività
showCheckStyleResultsIfFailed
dichiara una proprietàaCheckFailed
e la inizializza su true. Quando viene eseguito, controlla se è ancora vero (il che significa che il controllo non è stato completato con successo) e, in tal caso, apre il report utilizzandoshowCheckStyleResultsInBrowser
. checkstyleMain
è l'attività che esegue il controllo effettivo. Sono interessato al suo risultato. Comunque non so come arrivarci. Quindi, al termine dell'attivitàcheckStyleMain
, ho impostato la proprietàaCheckFailed
sufalse
basandosi sul fatto che l'ultimo passaggio verrà eseguito solo se nessuno dei controlli precedenti ha avuto esito negativo.showCheckStyleResultsIfFailed
è impostato per l'esecuzione dopocheckstyleMain
indipendentemente dal numero difinalizedBy
. In questo modo verrà eseguito anche se l'errore non riesce. Utilizza la proprietàaCheckFailed
per determinare se è stato completato correttamente.
Questo funziona correttamente se eseguo una compilazione completa. Ma se eseguo solo una ricostruzione parziale e l'attività checkstyleMain non viene eseguita, poiché tutti i suoi risultati sono già aggiornati, ho finito con aCheckFailed
true perché non è stato eseguito checkstyleMain
, il che fa sembrare che qualcosa effettivamente è andato storto.
Quindi, come posso eseguire l'attività showCheckStyleResultsInBrowser
se e solo se l'attività checkstyleMain non riesce? Inoltre, la mia soluzione sembra piuttosto ingombrante e hacky anche per quello che ottiene. C'è un modo più semplice?
Questo rende davvero molto più bello grazie. –
@PeterNiederwieser true, se possibile, vorrei utilizzare il risultato effettivo del controllo. Ma per ora stavo cercando come generalmente qualcosa a seconda del risultato del compito. Ma se sai come arrivare alla lista delle violazioni dello stile di controllo, sarebbe fantastico. Attualmente, tutto ciò che non è un "errore" nello stile di controllo rende l'attività completata correttamente, il che significa che non mostrerò alcun risultato. –
@JoachimKurz Ripensandoci, non conosco una soluzione migliore di questa. Per quanto riguarda il codice originale, si noti che 'Task # execute' è un metodo interno e non deve essere chiamato dal codice utente. Invece farei 'showCheckStyleResultsIfFailed' un altro task' Exec'. Le due attività possono essere configurate in un colpo solo, ma probabilmente non ne vale la pena. –