Méthode recommandée pour arrêter une compilation Gradle

162

Comment puis-je arrêter une compilation Gradle après avoir détecté un problème? Je peux utiliser une assert, lancer une exception, faire un System.exit (mauvaise idée) ou utiliser une fonction dédiée dans Gradle (mais je n'ai pas pu en trouver). Quelle est la meilleure façon pour Gradle (et pourquoi?).

Kartoch
la source

Réponses:

117

Je lance généralement l'exception pertinente du org.gradle.apipackage , par exemple InvalidUserDataExceptionlorsque quelqu'un a entré quelque chose d'invalide, ou GradleScriptExceptionpour des erreurs plus générales.

Si vous souhaitez arrêter la tâche ou l'action en cours et passer à la suivante, vous pouvez également lancer un StopActionException

tim_yates
la source
5
Vous pouvez également utiliser TaskExecutionException si une tâche ne s'exécute pas correctement. (Cela est vrai selon la documentation de la gradle 1.11, je ne sais pas quand il a été introduit.)
Josh Gagnon
y a-t-il de belles options de syntaxe ici? Considérez la syntaxe des conditions préalables de kotlin: require(something != whatever) { "No good!" }par opposition à la syntaxe plus verbeuse et type-eeif(something != whatever){ throw new GradleException("No good!") }
Groostav
Ce qui est horrible, GradleScriptExceptionc'est qu'il nécessite un deuxième paramètre pour une cause.
Trejkaz
... Bien sûr, nous évitons de dire qu'il s'agit de " programmation par exceptions "?! Je l' ai écrit héritage Codé de cette façon et il est horreur de maintenir ... Dans les jours olde la philosophie autour makeest que rules(tâche s) réussi ou échoué. J'ai essayé une fois return false- Gradle l'a simplement ignoré et a continué à courir.
sera le
87

Si vous souhaitez arrêter la compilation, lancez:

throw new GradleException('error occurred')

ou lancez les sous-classes pour l'exception ci-dessus. Certaines des exceptions de sous-classe échouent en fait uniquement la tâche en cours, mais continuent avec la génération.

skipy
la source
28

Il n'y a actuellement pas de méthode dédiée, bien qu'il y ait eu des discussions pour en ajouter une.

La méthode recommandée pour arrêter une génération Gradle est de lever une exception. Puisque Groovy n'a pas vérifié les exceptions et que Gradle par défaut n'imprime pas le type d'exception, ce n'est pas si critique quelle exception est levée. Dans les scripts de construction, GradleException est souvent utilisé, mais une assertion Groovy semble également raisonnable (selon les circonstances et le public). L'important est de fournir un message clair. L'ajout d'une cause (si disponible) aide au débogage ( --stacktrace).

Gradle fournit des types d'exception dédiés StopExecutionException/ StopActionExceptionpour arrêter la tâche / action de tâche en cours mais continuer la construction.

Peter Niederwieser
la source
19

Une autre option si vous ne souhaitez pas pouvoir attraper l'exception plus tard est d'appeler la tâche ant fail. C'est un peu plus facile à lire à mon avis et vous pouvez donner un beau message à l'utilisateur sans utiliser --stacktrace.

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

Vous donne un message comme:

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

Vous pouvez probablement attraper cela (peut-être que cela lance l'exception BuildException de fourmi?) Mais si c'est un objectif, je n'utiliserais pas ant.fail. Je rendrais juste facile de voir quelle exception attraper en lançant une exception gradle standard comme tim_yates l'a suggéré.

Gus
la source
Comment le configurer? Appeler?
poudre366
1
il suffit d'appeler ant.fail ('message de votre choix') aucune configuration requise
Gus
2
Il semble que la sortie de ceci soit identique à l'utilisation de throw new GradleException("The sky is falling!!")(Gradle 3.4.1)
mgaert
@mgaert Il me semble que je me souviens qu'il y a 4 ans, quand j'ai écrit ceci, le message imprimé était différent (mais cela fait longtemps et je n'ai pas envie de savoir quelle version était actuelle à ce moment-là et de vérifier). Au-delà de cela, IMHO ant.fail communique plus clairement l'intention d'arrêter complètement la construction, alors que l'exception levée se lit comme quelque chose qui pourrait être intercepté et traité.
Gus
12

Lancer une simple GradleException permet d'arrêter le script de construction. Cela fonctionne très bien pour vérifier la configuration de l'environnement requise.

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

Exemple:

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

Voici un fragment de code qui tente d'émuler la manière dont la tâche javac Gradle génère des erreurs:

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." )
            )
        }
    }
}

Lorsque la commande revient, 0il n'y a pas de sortie. Toute autre valeur imprimera le standardOutput et arrêtera la génération.

REMARQUE: si votre commande écrit également dans errorOutput, vous devrez peut-être l'inclure dans le journal des erreurs.

cmcginty
la source