Подтвердить что ты не робот

Значение 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 и блок кода конкретно?

4b9b3361

Ответ 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 получают некоторое время, чтобы привыкнуть к...