Я озадачен синтаксисом gradle, как показано ниже:
// style 1
test {
useTestNG()
}
, где test
- это задача, а также свойство проекта для сценария build.gradle.Приведенный выше код эквивалентен
// style 2
test.useTestNG()
Стиль 2 - простой и удобный код.Стиль 1 подобен использованию классного with
метода , за исключением того, что он не имеет части .with
.Мне удалось получить нечто подобное, добавив метод call(Closure)
в метакласс.См. Приведенный ниже код.
def sb = new StringBuilder()
sb.metaClass.call = {action -> delegate.with action}
sb {
append('hello')
}
Однако я сомневаюсь, что это реализация gradle.
Еще один более сложный синтаксис, как показано ниже:
task hello {
doLast {println 'hello world'}
}
Если мы сломаем вышекод, структура выглядит так task hello closure
.Порядок оценки довольно загадочный для меня.Я могу представить две возможности:
- код эквивалентен
task(hello(closure))
- код эквивалентен
task(hello)(closure)
для 1,это не похоже на путь бездействия.Тем не менее, я быстро экспериментировал с DSL после этого документа .Похоже, это то, что происходит при запуске сценария DSL.
Для 2 это похоже на путь gradle, потому что я вижу этот код в исходном коде gradle.Этот код представляет собой двухэтапную операцию.Сначала task(hello)
создает новое задание.Во-вторых, новая задача настроена на закрытие.Кажется, код как someTask(closure)
переводится в someTask.configure(closure)
.Однако я не уверен.
В любом случае, любое объяснение приведенных выше примеров синтаксиса и того, как Gradle реализует их, приветствуется.