2012-04-25 14 views
110

Come posso interrompere una build di Gradle dopo aver rilevato un problema? Posso usare un assert, lanciare un'eccezione, fare un System.exit (cattiva idea), o usare una funzione dedicata in Gradle (ma non ho potuto trovarne una). Qual è il modo migliore per Gradle (e perché?).Modo consigliato per arrestare una build di Gradle

risposta

88

Solitamente lancio l'eccezione rilevante da org.gradle.api package, ad esempio InvalidUserDataException per quando qualcuno ha inserito qualcosa di non valido, o GradleScriptException per errori più generali.

Se si desidera interrompere l'attività o azione in corso, e passare a quello successivo, si può anche gettare un StopActionException

+4

È anche possibile utilizzare [TaskExecutionException] (http://www.gradle.org/docs/current/javadoc/org/gradle/api/tasks/TaskExecutionException.html) se un'attività non viene eseguita correttamente. (Questo è vero secondo i documenti di gradle 1.11, non sono sicuro quando è stato introdotto.) –

+0

ci sono delle belle opzioni di sintassi qui? Considera la sintassi delle precondizioni di kotlin: 'require (qualcosa! = Qualunque cosa) {" Non va bene! " } 'al contrario di più verbose e type -ee' if (qualcosa! = qualunque) {lancia nuova GradleException ("No good!")} ' – Groostav

+0

La cosa terribile di' GradleScriptException' è che richiede un secondo parametro per un causa. – Trejkaz

21

non esiste attualmente alcun metodo dedicato, anche se ci sono state discussioni per aggiungere uno.

Il metodo consigliato per interrompere una build di Gradle consiste nel generare un'eccezione. Poiché Groovy non ha eccezioni controllate, e Gradle di default non stampa il tipo di eccezione, non è così critico quale eccezione viene lanciata. Negli script di compilazione, viene spesso utilizzata GradleException, ma un'asserzione Groovy sembra ragionevole (a seconda delle circostanze e del pubblico). L'importante è fornire un messaggio chiaro. L'aggiunta di una causa (se disponibile) aiuta a eseguire il debug (--stacktrace).

Gradle fornisce tipi di eccezione dedicati StopExecutionException/StopActionException per l'arresto dell'azione attività/attività corrente ma continuazione della compilazione.

53

Se si desidera interrompere la compilazione, buttare:

throw new GradleException('error occurred') 

o gettare le sottoclassi per l'eccezione di cui sopra. Alcune eccezioni delle sottoclassi in realtà falliscono solo l'attività corrente, ma continuano con la compilazione.

13

Un'altra opzione se non si desidera essere in grado di rilevare l'eccezione in un secondo momento è chiamare l'operazione di fail della formica. È leggermente più facile da leggere secondo me e puoi dare un bel messaggio all'utente senza usare --stacktrace.

task (tarball, dependsOn: warAdmin) << { 
    ant.fail('The sky is falling!!') 
} 

ti dà un messaggio del tipo:

* What went wrong: 
Execution failed for task ':tarball'. 
> The sky is falling!! 

Probabilmente possibile prendere questo (forse getta BuildException formica?), Ma se questo è un obiettivo quindi non vorrei usare formica. fallire. Vorrei semplicemente rendere più semplice vedere quale eccezione prendere generando un'eccezione gradle standard come suggerito da tim_yates.

+0

Come posso configurarlo? Chiamalo? – powder366

+0

chiama semplicemente ant.fail ('messaggio di tua scelta') nessuna configurazione richiesta – Gus

+1

Sembra che l'output di questo è ** identico ** all'utilizzo di 'lancia nuova GradleException (" Il cielo sta calando !! ")' (Gradle 3.4.1) – mgaert

9

Lanciare un semplice GradleException funziona per fermare lo script di compilazione. Funziona alla grande per il verificando l'impostazione dell'ambiente richiesto.

GradleException('your message, why the script is stopped.') 

Esempio:

if(null == System.getenv()['GRADLE_USER_HOME']) { 
    throw new GradleException('Required GRADLE_USER_HOME environment variable not set.') 
} 
1

Ecco un frammento di codice che cerca di emulare come il compito javac Gradle genera errori:

task myCommand(type:Exec) { 

    ... normal task setup .... 

    ignoreExitValue true 
    standardOutput = new ByteArrayOutputStream() 
    ext.output = { standardOutput.toString() } 
    doLast { 
     if (execResult.exitValue) { 
      logger.error(output()) 
      throw new TaskExecutionException(it, 
       new Exception("Command '${commandLine.join(' ')}' failed; " 
           + "see task output for details.") 
      ) 
     } 
    } 
} 

Quando il comando restituisce 0 non c'è uscita. Qualsiasi altro valore stamperà lo standard Output e fermerà la build.

NOTA: Se il comando scrive anche su errorOutput, potrebbe essere necessario includerlo nel registro degli errori.

Problemi correlati