Попытка понять свойства проекта gradle - PullRequest
10 голосов
/ 10 октября 2011

Очевидно, я не понимаю, что здесь происходит.

Я думаю, что prop2 и prop3 недоступны, потому что они являются переменными, а не "свойствами проекта".

Вопрос возник, потому что я хотел бы, чтобы переменные prop2 и prop3 были видны из метода "doTheThing ()", но я не хочу их передавать. Я хочу, чтобы переменные были глобально доступны для задачи, методы и классы (но только изнутри самого скрипта сборки) - и я хочу, чтобы они были напечатаны (поэтому определение prop1 неприемлемо).

Правда, я думаю, мне нужна помощь в понимании того, что такое свойство проекта Gradle и что на самом деле делает синтаксис prop1 = "blah".

Я прочитал руководство пользователя Gradle, а также Gradle in Action - если они уже объясняют эту концепцию, пожалуйста, укажите мне на правильный раздел (возможно, я упустил из виду его в то время, не понимая, что говорится).

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 Ответ

19 голосов
/ 10 октября 2011

Когда вы объявляете переменную на самом внешнем уровне (как в вашем втором и третьем утверждении), она становится локальной переменной метода run скрипта.Это действительно просто поведение Groovy, и Gradle ничего не может изменить.

Если вы хотите эквивалент глобальной переменной, просто присвойте значение несвязанной переменной (как в вашем первом утверждении).Это добавляет динамическое свойство к объекту Gradle Project, которое видно по всему сценарию сборки (если не затенено).Другими словами, prop1 = "blah" эквивалентно project.prop1 = "blah".

Если вам нужен эквивалент типизированной глобальной переменной, вам придется подождать, пока Gradle обновится до Groovy 1.8, что делает это возможным с помощью@Field аннотация.Или вы пишете плагин, который смешивает объект соглашения с объектом Project (но это не подходит для специальных сценариев).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...