2012-09-07 12 views
29

Estoy tratando de aprender Gradle. Mi estilo preferido de aprendizaje es comprender a un nivel bajo lo que está sucediendo. A tal fin, que estoy tratando de interpretar lo que está sucediendo en example 6.1 de la documentación con respecto a la DSL reference:Cómo interpretar Gradle DSL

task hello { 
    doLast { 
     println 'Hello world!' 
    } 
} 

entiendo que este script se ejecuta en el contexto de un Project. Entonces puedo ver por el Projectdocumentation que hay una cantidad de métodos task(...) sobrecargados. Al mirar las firmas, necesito elegir una que tenga un cierre como argumento final. Y dado que no estamos pasando un Map aquí, supongo que el método que se está llamando es task(String name, Closure closure).

Sin embargo, la parte con la que estoy luchando es cómo, en este script, la cadena literal hello se correlaciona con un String.

Otro ejemplo es example 6.7:

task taskX(dependsOn: 'taskY') << { 
    println 'taskX' 
} 

task taskY << { 
    println 'taskY' 
} 

Aquí, supongo que estamos llamando a la forma del método task(Map<String, ?> args, String name). Pero,

  1. Una vez más, ¿cómo la cadena literal taskX terminar como un String?
  2. Dado que los paréntesis no se usan para construir un literal Map, ¿cómo la parte entre paréntesis termina siendo un Map?
  3. Si he averiguado correctamente qué método se está llamando, ¿no son los argumentos dados en el orden incorrecto en la secuencia de comandos en comparación con la documentación de DSL?
  4. La sintaxis que usa paréntesis se ve por todo el mundo como una llamada a método. Lo que podría indicar delegación en el objeto Project para resolver taskX como un método desconocido. Pero, AFAIK, una llamada a un método no sería sintácticamente válida en este punto dado el método llamado a task que lo precede inmediatamente.

Como puede ver, estoy un poco confundido sobre cómo la sintaxis de ejemplo se relaciona con la guía de referencia DSL, lo que me dificulta entender realmente lo que está sucediendo a nivel de base .

Gracias!

+1

Tengo la misma confusión que usted. Y realmente espero que gradleware pueda proporcionar alguna explicación. – peacepassion

+0

Esta pregunta puede ser más detallada. [sintaxis groovy en una definición de tarea gradle] (http://stackoverflow.com/questions/27584463/understanding-the-groovy-syntax-in-a-gradle-task-definition/27584555#27584555) – user3875388

+0

Posible duplicado de [comprensión la sintaxis groovy en una definición de tarea gradle] (https://stackoverflow.com/questions/27584463/understanding-the-groovy-syntax-in-a-gradle-task-definition) – tkruse

Respuesta

17

La variación task foo de la sintaxis de declaración de tareas es especial ya que se implementa utilizando un complemento de compilador Groovy. Hasta donde yo sé, este es el único caso donde se usa un complemento de compilación para soportar una sintaxis especial.

+4

Interesante. Soy relativamente nuevo en Groovy y una de las cosas que no me gusta es lo difícil que es descubrir qué sucede cuando la gente ha hecho cosas "inteligentes" como esta, generalmente para hacer que sus DSL sean fáciles de usar/escribir. ¿Tiene algún consejo específico sobre cómo puedo traducir (en mi cabeza) un guión y la guía de referencia DSL? – dty

+0

La sintaxis está documentada tanto en la guía del usuario como en la referencia DSL; tenga en cuenta cómo hablan de la tarea * palabra clave *. En retrospectiva, puede ser un poco exagerado, aunque se lee mejor que las alternativas no mágicas. Como dije, es una rara excepción. Teniendo en cuenta cómo analizó que debe haber algo "incorrecto" aquí, está en camino de comprender todo lo demás que sucede bajo las cubiertas del DSL de Gradle. –

+0

Gracias Peter. Una última pregunta, si puedo. ¿Podría indicarme el lugar correcto en la fuente de Gradle para ver este plugin de compilación en acción, por favor? – dty