您的位置:首页 > 其它

Gradle这个黑盒子

2015-08-22 00:22 896 查看

Gradle是什么

Gradle嘛,是基于Groovy语言实现的一款构造工具。注意啊,强调的是构建和Groovy。每个通过Gradle构建的项目都有一个build.gradle文件,叫构建脚本。Gradle提供(或者说封装)了一门DSL语言来编写这个构建脚本,描述构建过程。这个门语言可以参考这里

Gradle和Groovy

说到Gradle,就不得不说下Groovy了。Gradle的DSL就是在Groovy语言的基础上做的一些封装,定义了一些构建过程中会用到的类型和接口。所以Gradle的构建脚本完全可以使用Groovy语言进行描述。

Groovy闭包(closure)和委派(delegate)

Gradle中大量使用了委派模式,所以委派这个概念非常重要,是明白gradle构建脚本的关键。如下代码,我们来模拟一次dependencies构建块。

class DependencySpec {
def testCompile(String libraryIdentifier) {
println "Adding the $libraryIdentifier library..."
}
}

def dependencies2(Closure configurationClosure) {
def dependencySpec = new DependencySpec()
configurationClosure.delegate = dependencySpec
configurationClosure.resolveStrategy = Closure.DELEGATE_FIRST
configurationClosure()
}

dependencies2 {
testCompile 'junit:junit:4.11'
}

是不是觉得

dependencies2 {
testCompile 'junit:junit:4.11'
}

很熟悉?不错,就是我们build.gradle脚本中经常写到的依赖构建模块。这里dependencies2接收的闭包参数的delegate被设置成了DependencySpec对象。

dependencies2和平时我们用的dependencies2不同的莫过于两点,

dependencies是定义在Project中的,而dependencies2是在脚本中定义的。

dependencies向闭包参数委派的对象是DependencyHandler对象,而dependencies2向包参数委派的对象是DependencySpec对象。

所以在编写build.gradle脚本的时候,多点查看所调用的函数向闭包中委派了什么对象。

另外各位看官可以看下这两篇文章Understanding GradleGradle学习系列之三——读懂Gradle语法

build.gradle构建脚本

我们使用Gradle,其实说白了就在通过编写build.gradle脚本来描述gradle的构建过程。
build.gradle脚本其实对应了一个Gradle DSL中定义的Script类型对象(Build Script)。build.gradle中的每个命令都会封装到Script对象中(至于怎么封装我就不懂了。我觉得是一个大的闭包,包括了所有build.gradle中的所有代码,就叫build闭包吧。下面也是基于这个想法说的)。
Gradle运行时会执行这个build闭包,并且会把Project对象委派到build闭包。所以在build.gradle就可以通过调用Project的dependencies方法来向Project添加依赖了。如下面代码,

dependencies {
intTestCompile 'junit:junit:4.12'
compile 'org.ow2.asm:asm-all:4.0'
}

上面代码中,dependencies其实就是Project类型中定义的一个方法,接收一个闭包作为参数,签名是dependencies(Closure configureClosure),并且把一个DependencyHandler对象委派到闭包中。
然后,下面内容是猜的,别当真,
dependencies方法中或者什么地方(反正我看源码都没有看出来)向ConfigurationContainer注册了一些名字是intTestCompile和compile的Configuration对象,同时定义了一些相同名字的方法,并且这些方法里调用了DependencyHandler对象的Dependency add(String configurationName, Object dependencyNotation)。

Task

我认为task是一个构建脚本的的一个片段,或者说是一些构建语句的集合(我觉得也还是一个闭包)。可以通过Project的task方法向Project中注册。如下面代码,

task hello {
doLast {
println 'Hello world!'
}
}

task是Project的一个方法,签名是task(name, configureClosure)。其中第二个参数就是上面我们定义的闭包。然后doLast方法是Task类中定义的一个方法,即task方法已经把一个Task对象委派给了我们定义的闭包。

总结

Gradle大量使用了闭包模式,构建过程中涉及的配置,无非就是通过闭包的委派模式,把需要设置的对象传到闭包中,让开发者自己决定怎么设值。至于设值的方式就方法调用啰,或者变量赋值啰。

原文
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Gradle 闭包 委派 原理