groovy build gradle

groovy - Forma recomendada de detener una compilación de Gradle



gradle to maven (6)

¿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 System.exit (mala idea), o usar una función dedicada en Gradle (pero no pude encontrar ninguna). ¿Cuál es la mejor manera para Gradle (y por qué?).


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. Dado que Groovy no tiene excepciones comprobadas, y Gradle de forma predeterminada no imprime el tipo de excepción, no es tan crítico qué excepción se produce. En los scripts de compilación, GradleException se usa a menudo, pero una afirmación de Groovy también parece razonable (según las circunstancias y el público). Lo importante es proporcionar un mensaje claro. Agregar una causa (si está disponible) ayuda a depurar ( --stacktrace ).

Gradle proporciona tipos de excepciones dedicadas StopExecutionException / StopActionException para detener la tarea / tarea actual pero continuar la compilación.


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, es posible que deba incluirlo en el registro de errores.


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

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


Otra opción si no tiene ningún deseo de poder detectar la excepción más adelante es llamar a la tarea de error de la hormiga. En mi opinión, es un poco más fácil de leer y puedes darle un buen mensaje al usuario sin el uso de --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 puedas ver esto (¿quizás arroje BuildException de la hormiga?) Pero si eso es un objetivo, entonces no usaría ant.fail. Simplemente haría que fuera más fácil ver qué excepción atrapar arrojando la excepción gradle estándar como sugirieron tim_yates.


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 subclase en realidad solo fallan en la tarea actual pero continúan con la compilación.