Forma recomendada de detener una compilación de Gradle


¿Cómo puedo detener una compilación de Gradle después de detectar un problema? Puedo usar una afirmación, lanzar una excepción, hacer un Sistema.salir (mala idea), o usar una función dedicada en Gradle (pero no pude encontrar una). ¿Cuál es la mejor manera de Gradle (y por qué?).

Author: Gus, 2012-04-25

6 answers

Por lo general tiro la excepción relevante de la org.gradle.api paquete, por ejemplo InvalidUserDataException para cuando alguien ha introducido algo inválido, o GradleScriptException para errores más generales.

Si desea detener la tarea o acción actual y pasar a la siguiente, también puede lanzar una StopActionException

 95
Author: tim_yates,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-01 20:45:17

Si quieres detener la compilación, lanza:

throw new GradleException('error occurred')

O lanzar las subclases para la excepción anterior. Algunas de las excepciones de subclases en realidad solo fallan en la tarea actual, pero continúan con la compilación.

 61
Author: skipy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-06 21:27:28

Actualmente no hay un método dedicado, aunque ha habido discusiones para agregar uno.

La forma recomendada de detener una compilación de Gradle es lanzar una excepción. Como Groovy no ha marcado excepciones y Gradle, de forma predeterminada, no imprime el tipo de excepción, no es tan crítica la excepción que se lanza. En los scripts de compilación, GradleException se usa a menudo, pero una afirmación Groovy también parece razonable (dependiendo de las circunstancias y la audiencia). Lo importante es proporcione un mensaje claro. Agregar una causa (si está disponible) ayuda a depurar (--stacktrace).

Gradle proporciona tipos de excepción dedicadosStopExecutionException/StopActionException para detener la acción tarea/tarea actual pero continuar la compilación.

 22
Author: Peter Niederwieser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-25 09:32:20

Otra opción si no tiene ningún deseo de poder capturar la excepción más adelante es llamar a la tarea ant fail. Es un poco más fácil de leer en mi opinión y se puede dar un mensaje agradable al usuario sin el uso de st stacktrace.

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

Te da un mensaje como:

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

Probablemente tú can captura esto (tal vez lanza BuildException de ant? pero si eso es un objetivo, entonces no usaría ant.fallar. Sólo haría que fuera fácil ver qué excepción atrapar lanzando la excepción gradle estándar como sugiere tim_yates.

 13
Author: Gus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-13 16:13:10

Lanzar una simple GradleException funciona para detener el script de compilación. Esto funciona muy bien para comprobación de la configuración del entorno requerida.

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

Ejemplo:

if(null == System.getenv()['GRADLE_USER_HOME']) {
    throw new GradleException('Required GRADLE_USER_HOME environment variable not set.')
}
 9
Author: edvox1138,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-07 06:53:40

Aquí hay un fragmento de código que intenta emular cómo la tarea Gradle javac arroja errores:

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

Cuando el comando devuelve 0 no hay salida. Cualquier otro valor imprimirá la salida estándar y detendrá la compilación.

NOTA: Si su comando también escribe en errorOutput, puede que necesite incluirlo en el registro de errores.

 1
Author: cmcginty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-01 00:51:34