总结
到此,我个人觉得 Gradle 相关的内容都讲完了。很难相信我仅花了 1 个小时不到的时间就为实例 2 添加了 gradle 编译支持。在一周以前,我还觉得这是个心病。回想学习 gradle 的一个月时间里,走过不少弯路,求解问题的思路也和最开始不一样:
-
最开始的时候,我一直把 gradle 当做脚本看。然后到处到网上找怎么配置 gradle。可能能编译成功,但是完全不知道为什么。比如 NameDomainObjectContainer,为什么有 debug、release。能自己加别的吗?不知道怎么加,没有章法,没有参考。出了问题只能 google,找到一个解法,试一试,成功就不管。这么搞,心里不踏实。
-
另外,对语法不熟悉,尤其是 Groovy 语法,虽然看了下快速教材,但总感觉一到 gradle 就看不懂。主要问题还是闭包,比如 Groovy 那一节写得文件拷贝的例子中的 withOutputStream,还有 gradle 中的 withType,都是些啥玩意啊?
-
所以后来下决心先把 Groovy 学会,主要是把自己暴露在闭包里边。另外,Groovy 是一门语言,总得有 SDK 说明吧。写了几个例子,慢慢体会到 Groovy 的好处,也熟悉 Groovy 的语法了。
- 接着开始看 Gradle。Gradle 有几本书,我看过 Gradle in Action。说实话,看得非常痛苦。现在想起来,Gradle 其实比较简单,知道它的生命周期,知道它怎么解析脚本,知道它的 API,几乎很快就能干活。而 Gradle In Action 一上来就很细,而且没有从 API 角度介绍。说个很有趣的事情,书中有个类似下面的例子
task myTask << {
println ' I am myTask'
}
书中说,如果代码没有加<<,则这个任务在脚本 initialization(也就是你无论执行什么任务,这个任务都会被执行,I am myTask 都会被输出)的时候执行,如果加了<<,则在 gradle myTask 后才执行。
尼玛我开始完全不知道为什么,死记硬背。现在你明白了吗????
这和我们调用 task 这个函数的方式有关!如果没有<<,则闭包在 task 函数返回前会执行,而如果加了<<,则变成调用 myTask.doLast 添加一个 Action 了,自然它会等到 grdle myTask 的时候才会执行!
现在想起这个事情我还是很愤怒,API 都说很清楚了......而且,如果你把 Gradle 当做编程框架来看,对于我们这些程序员来说,写这几百行代码,那还算是事嘛??