Реализация синтаксиса gradle: свойство с последующим закрытием конфигурации - PullRequest
0 голосов
/ 30 декабря 2018

Я озадачен синтаксисом 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.Порядок оценки довольно загадочный для меня.Я могу представить две возможности:

  1. код эквивалентен task(hello(closure))
  2. код эквивалентен task(hello)(closure)

для 1,это не похоже на путь бездействия.Тем не менее, я быстро экспериментировал с DSL после этого документа .Похоже, это то, что происходит при запуске сценария DSL.

Для 2 это похоже на путь gradle, потому что я вижу этот код в исходном коде gradle.Этот код представляет собой двухэтапную операцию.Сначала task(hello) создает новое задание.Во-вторых, новая задача настроена на закрытие.Кажется, код как someTask(closure) переводится в someTask.configure(closure).Однако я не уверен.

В любом случае, любое объяснение приведенных выше примеров синтаксиса и того, как Gradle реализует их, приветствуется.

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