Modo consigliato per fermare una build Gradle


162

Come posso interrompere una build Gradle dopo aver rilevato un problema? Posso usare un'asserzione, lanciare un'eccezione, fare un System.exit (cattiva idea) o usare una funzione dedicata in Gradle (ma non sono riuscito a trovarne uno). Qual è il modo migliore per Gradle (e perché?).

Risposte:


117

Generalmente lancio l'eccezione pertinente dal org.gradle.apipacchetto , ad esempio InvalidUserDataExceptionquando qualcuno ha inserito qualcosa di non valido o GradleScriptExceptionper errori più generali.

Se vuoi interrompere l'attività o l'azione corrente e passare a quella successiva, puoi anche lanciare a StopActionException


5
È inoltre possibile utilizzare TaskExecutionException se un'attività non viene eseguita correttamente. (Questo è vero secondo i documenti di grado 1.11, non sono sicuro di quando è stato introdotto.)
Josh Gagnon,

ci sono delle belle opzioni di sintassi qui? Considera la sintassi delle precondizioni di Kotlin: require(something != whatever) { "No good!" }al contrario di quella più dettagliata e di tipo if(something != whatever){ throw new GradleException("No good!") }
-ee

La cosa terribile GradleScriptExceptionè che richiede un secondo parametro per una causa.
Trejkaz,

... Naturalmente stiamo evitando di dire che si tratta di " programmazione per eccezioni " ?! Ho un codice in codice scritto in quel modo ed è un orrore da mantenere ... Ai vecchi tempi la filosofia intorno makeè che rules(i compiti) hanno avuto successo o fallito. Una volta ho provato return false- Gradle l'ha semplicemente ignorato e ha continuato a correre.
sarà il

87

Se vuoi fermare la build, lancia:

throw new GradleException('error occurred')

o lanciare le sottoclassi per l'eccezione sopra. Alcune delle eccezioni della sottoclasse in realtà falliscono solo l'attività corrente ma continuano con la compilazione.


28

Al momento non esiste un metodo dedicato, sebbene ci siano state discussioni per aggiungerne uno.

Il modo consigliato per fermare una build Gradle è lanciare un'eccezione. Poiché Groovy non ha verificato le eccezioni e Gradle per impostazione predefinita non stampa il tipo di eccezione, non è fondamentale quale eccezione venga generata. Negli script di build, viene spesso utilizzata GradleException, ma anche un'affermazione Groovy sembra ragionevole (a seconda delle circostanze e del pubblico). L'importante è fornire un messaggio chiaro. L'aggiunta di una causa (se disponibile) aiuta per il debug ( --stacktrace).

Gradle fornisce tipi di eccezione dedicati StopExecutionException/ StopActionExceptionper interrompere l'attività / azione corrente ma continuare la compilazione.


19

Un'altra opzione se non hai alcun desiderio di essere in grado di catturare l'eccezione in un secondo momento è quella di chiamare l'attività ant fail. Secondo me è leggermente più facile da leggere e puoi inviare un bel messaggio all'utente senza usare --stacktrace.

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

Ti dà un messaggio come:

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

Probabilmente puoi prenderlo (forse genera BuildException di formica?) Ma se questo è un obiettivo, allora non userei ant.fail. Vorrei solo rendere più semplice vedere quale eccezione catturare lanciando un'eccezione di livello standard come suggerito da tim_yates.


Come lo installo? Chiamalo?
powder366

1
chiama semplicemente ant.fail ('messaggio a tua scelta') nessuna installazione richiesta
Gus

2
Sembra che l'output di questo sia identico all'utilizzo throw new GradleException("The sky is falling!!")(Grado 3.4.1)
mgaert

@mgaert Mi sembra di ricordare che 4 anni fa, quando ho scritto questo, il messaggio stampato era diverso (ma è molto tempo e non ho voglia di capire quale versione era in quel momento e controllare). Oltre a ciò, la ant.fail di IMHO comunica più chiaramente l'intenzione di fermare completamente la build, mentre l'eccezione generata si legge come qualcosa che potrebbe essere catturato e gestito.
Gus,

12

Lanciare un semplice GradleException funziona nell'arrestare lo script di compilazione. Funziona alla grande per verificare la configurazione 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.')
}

6

Ecco un frammento di codice che tenta di emulare il modo in cui l'attività Gradle javac 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 ritorna, 0non c'è output. Qualsiasi altro valore stamperà lo standardOutput e interromperà la generazione.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.