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 Gradle和Gradle学习系列之三——读懂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大量使用了闭包模式,构建过程中涉及的配置,无非就是通过闭包的委派模式,把需要设置的对象传到闭包中,让开发者自己决定怎么设值。至于设值的方式就方法调用啰,或者变量赋值啰。原文
相关文章推荐
- SourceProvider.getJniDirectories
- 执行失败的任务 ': processDebugManifest'
- 深入理解PHP之匿名函数
- 二级域名原理以及程序
- Ruby中使用Block、Proc、lambda实现闭包
- LUA中的闭包(closure)浅析
- Lua中的闭包学习笔记
- C#中函数的创建和闭包的理解
- 一根网线内的8根线哪4根是传输数据的,哪四根是防干扰的
- Android Studio使用教程(六):Gradle多渠道打包
- TCP三次握手及原理
- jQuery中的pushStack实现原理和应用实例
- sqlserver索引的原理及索引建立的注意事项小结
- php中的ini配置原理详解
- PHP strtotime函数用法、实现原理和源码分析
- Base64编码解码原理及C#编程实例
- IsPostBack原理的介绍
- 深入理解javascript作用域和闭包
- javascript作用域和闭包使用详解
- 谈谈JavaScript中的函数与闭包