Значение ext и кода в файле gradle
ext {
springVersion = "3.1.0.RELEASE"
emailNotification = "[email protected]"
}
Выше код - это фрагмент build.gradle
Я понимаю, что метод вызова ext с параметром закрытия {}.
это правильно?
Поэтому я думаю, что gradle получает доступ к параметрам springVersion и emailNotification.
Я буду проверять свое предположение ниже кода
def ext(data) {
println data.springVersion
}
ext {
springVersion = "3.1.0.RELEASE"
emailNotification = "[email protected]"
}
но запустите этот код
ниже Ошибка.
groovy.lang.MissingPropertyException: No such property: springVersion for class: Test
Вы объясняете ext и блок кода конкретно?
Ответы
Ответ 1
ext
является сокращением для project.ext
и используется для определения дополнительных свойств для объекта project
. (Также возможно определить дополнительные свойства для многих других объектов.) При чтении дополнительного свойства ext.
опускается (например, println project.springVersion
или println springVersion
). То же самое работает из методов. Не имеет смысла объявлять метод с именем ext
.
Ответ 2
Вот объяснение того, почему пример кода в вопросе вызывает ошибку.
В коде:
ext {
springVersion = "3.1.0.RELEASE"
emailNotification = "[email protected]"
}
Не переходит к функции "ext" объекта, который имеет свойства springVersion и emailNotification. Кудрявые фигурные скобки не означают POJO, а закрытие.
Вот почему функция "ext" жалуется, что не может получить свойства.
Идея с таким закрытием, называемая закрытием конфигурации, заключается в том, что принимающая функция будет:
Таким образом, замыкание выполняется, и когда оно ссылается на методы/свойства, они будут выполняться над настраиваемым объектом.
Таким образом, следующая модификация вашего кода заставит его работать:
class DataObject {
String springVersion;
String emailNotification;
}
def ext(closure) {
def data = new DataObject() // This is the object to configure.
closure.delegate = data;
// need this resolve strategy for properties or they just get
// created in the closure instead of being delegated to the object
// to be configured. For methods you don't need this as the default
// strategy is usually fine.
closure.resolveStrategy = Closure.DELEGATE_FIRST
closure() // execute the configuration closure
println data.springVersion
}
ext {
springVersion = "3.1.0.RELEASE"
emailNotification = "[email protected]"
}
Надеюсь это поможет. Замыкания Groovy получают некоторое время, чтобы привыкнуть к...