Попытка понять свойства проекта gradle
Ясно, что я не понимаю, что здесь происходит.
Я думаю, что prop2 и prop3 не могут быть доступны, потому что они являются переменными вместо "свойств проекта".
Вопрос возник, потому что я хотел бы, чтобы переменные prop2 и prop3 были видны из метода doTheThing(), но я не хочу передавать их. Я хочу, чтобы переменные были глобально доступны для задачи, методы и классы (но только изнутри самой сборки script) - и я хочу, чтобы они были напечатаны (поэтому недопустимость определения prop1 неприемлема).
Правда, хотя, я думаю, что я прошу, это некоторая помощь, понимающая, что такое свойство проекта Gradle и что на самом деле делает синтаксис prop1 = "blah" '.
Я прочитал руководство пользователя Gradle, а также Gradle в действии - если они уже объясняют эту концепцию, пожалуйста, укажите мне правильную секцию (возможно, я замалчивал ее в то время, когда не понимал, что говорится).
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'
}
Ответы
Ответ 1
Когда вы объявляете переменную на внешнем уровне (как в вашем втором и третьем операторе), она становится локальной переменной метода script run
. Это действительно просто поведение Groovy, и ничего, что Gradle может легко измениться.
Если вы хотите получить эквивалент глобальной переменной, просто присвойте значение несвязанной переменной (как в первом заявлении). Это добавляет динамическое свойство к объекту Gradle Project
, который отображается во всей сборке script (если не затенен). Другими словами, prop1 = "blah"
эквивалентно project.prop1 = "blah"
.
Если вам нужен эквивалент типизированной глобальной переменной, вам придется подождать до Gradle до Groovy 1.8, что делает возможным это с помощью аннотации @Field
. Или вы пишете плагин, который смешивает объект конвенции в объекте Project
(но не подходит для сценариев ad-hoc).