写出gradle风格的groovy代码
写出gradle风格的groovy代码
我们先来看一段gradle中的代码:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
task wrapper(type: Wrapper) {
gradleVersion = '2.10'
}
我第一次看gradle代码的时候是懵逼的,

这是哪门子语言,这到底是类似xml的标记语言还是类似java的语言?我不懂。不懂没关系,学了就懂了嘛。
大家现在已经知道了gradle使用groovy写的,所以他是我前面说的类似java的语言,但他是如何做到像上面这样炫酷吊炸天的写法呢?我们接下分析一下:
首先你在gradle中看不到;这是因为groovy支持不写;
println 'hello world'
下面我们看看这个:
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
}
这个放在groovy中怎么解读呢?首先我们需要知道的是groovy中方法调用时可以省略()的!!!对你没有看错,正如上面的println 'hello world',ok,那不难理解上面的dependencies是一个方法名了,这里是一个方法的调用,而不是方法的定义。既然是方法的调用,那就可以知道{}实际上就是一个groovy的闭包类型的参数。而这个闭包里面又是个classpath的方法调用。
既然上面被我说通了,那就写个例子试试吧:
def dependencies(Closure cl){
cl.call();
}
def classpath(String path){
println path
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
}
Look,代码运行正常。
那么我们再来看这个:
task clean(type: Delete) {
delete rootProject.buildDir
}
这个用上面的思路套进去看看呢?task是一个方法,没毛病。后面是两个参数?clean和一个闭包?这里就不对了,如果是两个参数,中间需要有,隔开,所以这里只有一个参数,就是clean。那这就是什么写法?这里我们又要了解groovy中的一个语法特性,
当一个方法的最后一个参数是闭包,可以将这个闭包写在
()外面。
看例子:
def foo(String s,Closure cl){
cl(s)
}
//❶
foo('hello world'){
println it
}
foo 'hello world',{
println it
}
方法的两种特殊写法都在这了,上面讲个写法就是❶处的写法。
所以把clean理解为一个参数是对的,接着再看clean(type: Delete)这个就简单了,groovy中的方法参数是支持命名参数的,这里用的就是命名参数,到这里都理顺了,我们还是写一个小例子模仿一下上面的写法:
def task(String taskName){
println 'execute task ' + taskName
}
def clean(Map type,Closure cl){
type.type
}
def delete(String path){
}
Delete = 'delete'
task clean(type:Delete){
delete "path"
}
这里我很勉强的写出了类似的代码,但gradle中的这些写法真的是我们理解的这样子吗?我们使用代码跟踪来看看.
首先看看dependencies是不是一个方法?
void dependencies(Closure var1);
哈哈,还真是的,而且参数的确是一个闭包。
那在看看classpath是不是一个方法?
WTF,见鬼了,跟踪classpath的结果如下:
Dependency add(String configurationName, Object dependencyNotation);
竟然跟踪到了这个add方法,而且add方法还有两个参数,这是什么鬼?更诡异的是这个add方法属于DependencyHandler.java这个接口,对你没看错,是java接口。What the hell???
冷静一下。。。

我们分析一下,为什么会发生这种事情,这个难道已经超出我们认知的方位了?其实不然,虽然现在我也是啥都不知道,但我觉得这其中的原由一定能够在gradle中找到,所以就然我们正式开启学习gradle的大门吧。

写出gradle风格的groovy代码的更多相关文章
- PyTorch最佳实践,怎样才能写出一手风格优美的代码
[摘要] PyTorch是最优秀的深度学习框架之一,它简单优雅,非常适合入门.本文将介绍PyTorch的最佳实践和代码风格都是怎样的. 虽然这是一个非官方的 PyTorch 指南,但本文总结了一年多使 ...
- [label][翻译][JavaScript-Translation]七个步骤让你写出更好的JavaScript代码
7 steps to better JavaScript 原文链接: http://www.creativebloq.com/netmag/7-steps-better-javascript-5141 ...
- 写出形似QML的C++代码
最开始想出的标题是<Declarative C++ GUI库>,但太标题党了.只写了两行代码,连Demo都算不上,怎么能叫库呢……后来想换掉“库”这个字,但始终找不到合适词来替换.最后还是 ...
- 写具有良好风格的ABAP代码
编程风格是一个经久不衰的话题,大家所公认的事实是:一个良好的编程风格会带来很多的好处.而对于“良好”的标准,则众说纷纭,莫衷一是.编程风格在ABAP程序中当然也有着重要的意义,因为很少看到专门针对AB ...
- 让你用sublime写出最完美的python代码--windows环境
至少很长一段时间内,我个人用的一直是pycharm,也感觉挺好用的,也没啥大毛病 但是pycharm确实有点笨重,啥功能都有,但是有很多可能这辈子我也不会用到,并且pycharm打开的速度确实不敢恭维 ...
- PAT 1002 写出这个数 (20)(代码)
1002 写出这个数 (20)(20 分) 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值.这里保证n小于10^100 ...
- 写出良好风格的JS、CSS代码
现在代码的格式都有 eslint.prettier.babel 这些来保证,但是技术手段再高端都不能解决代码可读性的问题. 因为这个只有个人才能解决.但是注意一下事项,可以显著提高代码的可读性.可识别 ...
- 推荐4款个人珍藏的IDEA插件!帮你写出不那么差的代码
@ 目录 Codota:代码智能提示 代码智能补全 代码智能搜索 Alibaba Java Code Guidelines:阿里巴巴 Java 代码规范 手动配置检测规则 使用效果 CheckStyl ...
- 教你如何写出高效整洁的 css 代码——css优化(转载)
css 写起来并不难,但在大型项目中,就变得难以管理,特别是不同的人在 css 书写风格上稍有不同,团队上就更加难以沟通,为此总结了一些如何实现高效整洁的 css 代码原则. css 优化的原则 1. ...
随机推荐
- spring 优点
spring 的优点?1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实 ...
- 第三百零八节,Django框架,models.py模块,数据库操作——链表结构,一对多、一对一、多对多
第三百零八节,Django框架,models.py模块,数据库操作——链表结构,一对多.一对一.多对多 链表操作 链表,就是一张表的外键字段,连接另外一张表的主键字段 一对多 models.Forei ...
- ioc和aop的区别?
ioc:控制反转(Inversion of Control,英文缩写为IoC)把创建对象的权利交给框架,是框架的重要特征,并非面向对象编程的专用术语.它包括依赖注入(Dependency Inject ...
- Zookeeper 应用程序
Zookeeper为分布式环境提供灵活的协调基础架构.ZooKeeper框架支持许多当今最好的工业应用程序.我们将在本章中讨论ZooKeeper的一些最显着的应用. 雅虎 ZooKeeper框架最初是 ...
- mysql的优化:官网地址
http://dev.mysql.com/doc/refman/5.1/zh/optimization.html#index-merge-optimization
- centos6.5的软件安装,用户管理等
1.软件的安装命令: 第一种:以 软件名.rpm 为结尾的二进制文件,这样的文件的安装 rpm -ivh 软件名.rpm i 是 install v 是校验 h 进度 卸载软件 是 rpm -e 软件 ...
- 最有价值的50道java面试题 适用于准入职Java程序员
下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,原来的题目中有很多重复题目和无价值的题目,还有不少的参考答案也是错误的,修改后的Java面试题集参照了JDK最 ...
- 解决 Comparison method violates its general contract!
问题:Comparison method violates its general contract!报错 Collections.sort(list, new Comparator<Integ ...
- [转]JVM运行时内存结构
[转]http://www.cnblogs.com/dolphin0520/p/3783345.html 目录[-] 1.为什么会有年轻代 2.年轻代中的GC 3.一个对象的这一辈子 4.有关年轻代的 ...
- Javascript定义类(class)的最新方法
极简主义法 3.1 封装 这种方法不使用this和prototype,代码部署起来非常简单,这大概也是它被叫做"极简主义法"的原因. 首先,它也是用一个对象模拟"类&qu ...