你可以把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一樣想要。
雖然此鏈接可能會回答問題,但最好在此處包含答案的基本部分並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效 – 2015-04-06 21:10:43