2011-10-10 18 views
10

Claramente, no entiendo lo que está sucediendo aquí.Intentando comprender las propiedades del proyecto de gradle

Supongo que no se puede acceder a prop2 y prop3 porque son variables en lugar de "propiedades del proyecto".

La pregunta surgió porque me gustaría que las variables prop2 y prop3 fueran visibles desde el método "doTheThing()", pero no quiero tener que pasarlas. Quiero que las variables sean accesibles globalmente a tareas, métodos y clases (pero solo desde adentro en el script de compilación) - y quiero que sean tipeados (por eso la definición de prop1 no es aceptable).

Realmente, supongo que lo que estoy pidiendo es algo de ayuda para entender qué es una propiedad de proyecto de Gradle y qué es realmente la sintaxis 'prop1 = "blah' '.

He leído la guía de usuario de Gradle y también Gradle en acción: si ya explican este concepto, diríjanme a la sección correcta (tal vez lo pasé por alto en ese momento sin entender lo que estaba diciendo).

prop1 = "blah" 
String prop2 = "bleah" 
def prop3 = "blargh" 

task testPropAccess << { 
    println "1: $prop1" 
    println "2: $prop2" 
    println "3: $prop3" 
    doTheThing() 
} 

private void doTheThing(){ 
    println "4: $prop1" 
    println "5: $prop2" // error: Could not find property 'prop2' on root project 'script' 
    println "6: $prop3" // error: Could not find property 'prop3' on root project 'script' 
} 
+0

Esto también debería ayudar: http://groovy.codehaus.org/Scoping+and+the+Semantics+of+%22def%22 – rodion

+0

@Rodion - ese enlace fue bastante útil, gracias. Supongo que necesito hacer algo más de investigación orientada a Groovy. – Shorn

+0

Para cualquiera que quiera hacer algo similar, mi solución actual para obtener la funcionalidad que quiero es definir mis propiedades amplias de construcción-script en una clase como esta: 'class StaticProps { static String prop4 = System.getProperty (" prop4 " "wibble") } ' Y luego usarlos como esto: System.getProperty ("prop4"', StaticProps.prop4) '' ¿Por qué – Shorn

Respuesta

19

Cuando se declara una variable en el nivel más externo (como en el segundo y tercer estado), se convierte en una variable local del método de la secuencia de comandos run. Esto es realmente solo un comportamiento Groovy, y nada de lo que Gradle pueda cambiar fácilmente.

Si quiere el equivalente de una variable global, simplemente asigne un valor a una variable independiente (como en su primera declaración). Esto agrega una propiedad dinámica al objeto Project de Gradle, que está visible en todo el script de compilación (a menos que esté sombreado). En otras palabras, prop1 = "blah" es equivalente a project.prop1 = "blah".

Si desea el equivalente de una variable global tipada, tendrá que esperar hasta que Gradle se actualice a Groovy 1.8, lo que lo hace posible con la anotación @Field. O bien, escribe un complemento que mezcle un objeto de convención en el objeto Project (pero eso no es adecuado para scripts ad-hoc).

+16

Para cualquiera que se tropiece con esto, ahora se recomienda que al hacer lo que Peter sugiere, en su lugar, escriba' ext.prop1 = "blah" '. La técnica más antigua todavía funciona, pero está en desuso y genera una advertencia. Usar ext es solo una buena forma de indicar explícitamente que tiene la intención de crear una nueva propiedad. Si crees que estás usando una propiedad existente y estás creando una nueva sin darse cuenta, puede ser terriblemente frustrante, por lo que este es probablemente un cambio bastante bueno. –

+0

Hola otra vez Peter. Pregunta rápida, creé una variable 'ext.blah = 'foobar'' en el archivo build.gradle de nivel superior, pero no está en el alcance de' buildscript', ¿alguna idea de por qué? – Bob

+0

Eso debería ser una pregunta separada (si no existe ya). –

Cuestiones relacionadas