Вы можете думать о Gradle сценария сборки, как некоторый код который делегирован объекту, который может отвечать на вызовы метода, написанные на нем.
Скрипт использует много Groovy синтаксического сахара, поэтому удаление их, он должен выглядеть следующим образом:
Так что сценарий действительно куча вызовов метода:
def apply(Map)
def android(Closure)
def dependencies(Closure)
Это android(Closure)
получит замыкание и делегирует методы, называемые в нем объект, который может ответить на эти методы:
def compileSdkVersion(Integer)
def buildToolsVersion(String)
...
Учитывая что, мы можем разобрать скрипт, передать его некоторому объекту и t купите его.
Делегирование с использованием DelegatingBaseScript
это один из способов сделать это (не уверен, что если Gradle делает это таким образом). Вот упрощенных вниз рабочая версия:
import org.codehaus.groovy.control.CompilerConfiguration
gradleScript = '''
apply plugin: 'com.android.application'
android({
compileSdkVersion(21)
buildToolsVersion("21.1.2")
})'''
class PocketGradle {
def config = [apply:[]].withDefault { [:] }
def apply(map) {
config.apply << map.plugin
}
def android(Closure closure) {
closure.delegate = new Expando(
compileSdkVersion: { Integer version ->
config.android.compileSdkVersion = version
},
buildToolsVersion : { String version ->
config.android.buildToolsVersion = version
},
)
closure()
}
}
def compiler = new CompilerConfiguration(scriptBaseClass: DelegatingScript.class.name)
shell = new GroovyShell(this.class.classLoader, new Binding(), compiler)
script = shell.parse gradleScript
script.setDelegate(gradle = new PocketGradle())
script.run()
assert gradle.config == [
apply: ['com.android.application'],
android: [
compileSdkVersion: 21,
buildToolsVersion: '21.1.2'
]
]
Вы можете выполнить скрипт в Groovy Web Console
(нажмите на кнопку «Редактировать в консоли», а затем «Выполнить скрипт»).
Большая часть синтаксиса объяснения находятся в DSL section:
- командной цепи
Groovy позволяет опустить скобки вокруг аргументов в вызове метода для отчетности верхнего уровня. Функция «цепочка команд» расширяет это, позволяя нам связывать вызовы методов без круглых скобок, не требуя ни круглых скобок вокруг аргументов, ни точек между цепочечными вызовами.
Существует также Groovy ConfigSlurper
, но я не уверен, что он может зайти так далеко, как хочет Gradle.
Хотя эта ссылка может ответить на вопрос, лучше включить основные части ответа здесь и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменяется –