2012-04-25 11 views
110

¿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é?).Forma recomendada para detener una compilación de Gradle

Respuesta

88

lo general iniciar la excepción relevante desde el org.gradle.api package, por ejemplo InvalidUserDataException para cuando alguien ha entrado algo válido o GradleScriptException de los errores más generales.

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

+4

También puede usar [TaskExecutionException] (http://www.gradle.org/docs/current/javadoc/org/gradle/api/tasks/TaskExecutionException.html) si una tarea no se ejecuta correctamente. (Esto es cierto de acuerdo con los documentos de gradle 1.11, no estoy seguro de cuándo se introdujo.) –

+0

¿hay alguna buena opción de sintaxis aquí? Considere la sintaxis de condiciones previas de kotlin: 'require (something! = Whatever) {" No good! " } 'a diferencia de los más detallados y type-ee' if (something! = whatever) {throw new GradleException ("No good!")} ' – Groostav

+0

Lo horrible de' GradleScriptException' es que requiere un segundo parámetro para un porque. – Trejkaz

21

en la actualidad existe ningún método específico, aunque ha habido discusiones para añadir una.

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 con la compilación.

53

Si desea detener la acumulación, lanzar:

throw new GradleException('error occurred') 

o tirar las subclases de la excepción anteriormente. Algunas de las excepciones de subclase en realidad solo fallan en la tarea actual pero continúan con la compilación.

13

Otra opción si no tiene ningún deseo de poder atrapar la excepción más tarde es llamar a la tarea ant fallar. 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!!') 
} 

le da un mensaje como:

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

Probablemente puede capturas esto (tal vez lanza de hormiga BuildException?), Pero si eso es una meta, entonces yo no usaría hormiga. fallar. 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.

+0

¿Cómo lo configuro? ¿Llámalo? – powder366

+0

simplemente llame a ant.fail ('mensaje de su elección') no requiere configuración – Gus

+1

Parece que el resultado de esto es ** idéntico ** al uso de 'throw new GradleException (" El cielo está cayendo !! ")' (Gradle 3.4.1) – mgaert

9

Lanzar una GradleException simple funciona para detener el script de compilación. Esto funciona muy bien para comprobando 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.') 
} 
1

Aquí es un fragmento de código que trata de emular la forma en la tarea javac Gradle lanza 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.

Cuestiones relacionadas