web-dev-qa-db-fra.com

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

Comment puis-je arrêter une construction 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’en ai pas trouvé). Quel est le meilleur moyen pour Gradle (et pourquoi?).

146
Kartoch

Je jette généralement l’exception pertinente de org.gradle.api package , par exemple InvalidUserDataException lorsque quelqu'un a entré quelque chose d'invalide, ou GradleScriptException pour des erreurs plus générales.

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

111
tim_yates

Si vous voulez arrêter la construction, lancez:

throw new GradleException('error occurred')

ou jetez les sous-classes pour l'exception ci-dessus. Certaines des exceptions de sous-classes n'échouent que sur la tâche en cours mais poursuivent la construction.

74
skipy

Il n'y a actuellement aucune 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 lancer une exception. Comme Groovy ne dispose pas d'exceptions vérifiées et que Gradle, par défaut, n'imprime pas le type d'exception, le type d'exception levée n'est pas critique. GradleException est souvent utilisé dans les scripts de compilation, mais une assertion Groovy semble également raisonnable (en fonction des circonstances et du public cible). L'important est de fournir un message clair. Ajouter une cause (si disponible) aide au débogage (--stacktrace).

Gradle fournit des types d’exception dédiés StopExecutionException/StopActionException pour arrêter la tâche en cours/action de tâche mais poursuivre la construction.

24
Peter Niederwieser

Une autre option si vous ne souhaitez pas pouvoir détecter l'exception par la suite est d'appeler la tâche ant-échec. C'est un peu plus facile à lire à mon avis et vous pouvez donner un message gentil à 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!!

Probablement vous ( peut attraper ceci (peut-être qu'il lève une exception BuildException?), Mais si c'est un objectif, je n'utiliserais pas ant .échouer. Je ferais simplement en sorte de voir facilement quelle exception attraper en lançant une exception de gradé standard, comme suggéré par tim_yates.

15
Gus

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

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.')
}
10
edvox1138

Voici un fragment de code qui tente d'imiter 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." )
            )
        }
    }
}

Quand la commande retourne 0 il n'y a pas de sortie. Toute autre valeur imprimera le standardOutput et interrompra la construction.

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

3
cmcginty