Bazı kod olarak bir gradle yapı komut düşünebiliriz , içinde yazılı olan yöntem çağrılarına yanıt verebilecek bir nesneye verilen bir temsilci.
Senaryo çok bunları kaldırmayı, Groovy sözdizimsel çok şeker kullanır, bu gibi görünmelidir:
Yani senaryo gerçekten yöntemin bir demet çağırır:
def apply(Map)
def android(Closure)
def dependencies(Closure)
Bu android(Closure)
bir kapatma alacak ve bu yöntemlerin yanıt verebilir bir nesneye içinde denilen yöntemleri devredeceğini:
def compileSdkVersion(Integer)
def buildToolsVersion(String)
...
Verilen Bu, biz parsayı betiğine yapabiliriz, bazı nesnelere ve Onu çalıştır.
DelegatingBaseScript
kullanarak yetki verme, bunu yapmanın bir yoludur (Gradle bunu bu şekilde yapıp yapmadığından emin değil).
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'
]
]
Sen ("komut çalıştır" ardından "konsoldaki Düzenle" tıklayın ve) Groovy Web Console
içinde çalıştırabiliriz: Burada bir dumbed çalışma sürümüdür.sözdizimi açıklama çoğu
DSL section içindedir:
- Komut zincirleri
Groovy üst düzey ifadeleri için bir yöntemdir çağrısının argümanlar etrafında parantez ihmal sağlar. "komut zinciri" özelliği, bu tür parantez içermeyen yöntem çağrılarını zincirlememize izin vererek, bağımsız değişkenler etrafında parantezler veya zincirleme çağrılar arasında noktalar gerektirmemesiyle genişletir.
Ayrıca Groovy ConfigSlurper
da var, ancak Gradle istediği kadar gidebileceğinden emin değilim.
Bu bağlantı soruyu yanıtlayabilirken, cevabın temel kısımlarını buraya eklemek ve referans için bağlantı sağlamak daha iyidir. Bağlantılı sayfa değiştiğinde yalnızca bağlantı yanıtları geçersiz olabilir –