Dav*_*vid 5 groovy gradle android-studio android-gradle-plugin
以下groovy语法真正意味着什么?
Gradle文档讲述了build.gradle如何只是 groovy.Android团队已将默认的build.gradle简化为看起来不像代码(至少对我而言).请根据groovy语法解释这是做什么的.例如,Android插件使用的这些全局变量声明是什么?
如果您包含对http://groovy-lang.org/syntax.html的引用作为解释的一部分,则可获得奖励积分.
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "com.crittercism"
minSdkVersion 15
targetSdkVersion 21
versionCode 5
versionName "5.0"
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
Run Code Online (Sandbox Code Playgroud)
您可以将gradle构建脚本视为委托给对象的一些代码,该对象可以响应写入其中的方法调用.
该脚本使用了大量的Groovy语法糖,因此删除它们应该如下所示:
apply( [plugin: 'com.android.application'] );
android({
compileSdkVersion( 21 );
buildToolsVersion( "21.1.2" );
defaultConfig({
applicationId( "com.crittercism" );
minSdkVersion( 15 );
targetSdkVersion( 21 );
versionCode( 5 );
versionName( "5.0" );
});
});
dependencies({
compile( fileTree([dir: 'libs', include: ['*.jar']]) );
});
Run Code Online (Sandbox Code Playgroud)
所以脚本实际上是一堆方法调用:
def apply(Map) def android(Closure)def dependencies(Closure)这android(Closure)将接收一个闭包,并将其中调用的方法委托给一个可以响应这些方法的对象:
def compileSdkVersion(Integer)def buildToolsVersion(String)...鉴于此,我们可以解析脚本,将其委托给某个对象,然后执行它.
委派使用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'
]
]
Run Code Online (Sandbox Code Playgroud)
您可以执行该脚本Groovy Web Console(单击"在控制台中编辑",然后单击"执行脚本").
大多数语法解释都在DSL部分:
- 命令链
Groovy允许您省略围绕顶级语句的方法调用的参数的括号."命令链"功能通过允许我们链接这种无括号的方法调用来扩展它,既不需要围绕参数的括号,也不需要链接调用之间的点.
还有Groovy ConfigSlurper,但我不确定它是否可以达到Gradle想要的程度.
感谢 AndroidGuy 提供了让我了解以下信息的优秀视频。视频长达 35 分钟,所以这是 TL;DR。
大多数这种语法是方法调用和闭包的混合。闭包用花括号表示。另请注意,方法调用不需要括号。
apply plugin: 'com.android.application'
Run Code Online (Sandbox Code Playgroud)
这是使用单个命名参数“插件”调用项目对象上的apply方法。项目对象是 Gradle 提供的顶级对象。
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
Run Code Online (Sandbox Code Playgroud)
这是设置项目对象的依赖项属性。Groovy 属性基本上是 getter 和 setter 的简写。dependencies 属性是一个委托给DependencyHandler的 Closure 对象。Groovy 委托本质上是一种增加闭包范围解析的方法。依赖关系闭包包含一个单一的 compile 方法调用,它接受一个FileTree位置参数。FileTree 由在项目对象中定义的fileTree方法生成。编译方法对我来说还是有点模糊。它似乎来自Java插件,但它没有明确记录在那里。“编译”部分对我来说仍然有点神奇。
android {
...
}
Run Code Online (Sandbox Code Playgroud)
我将把“android”部分留给读者作为练习。Android Gradle 域特定语言 (DSL) 在网络上不可用。你必须下载它。
| 归档时间: |
|
| 查看次数: |
930 次 |
| 最近记录: |