写出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. ...
随机推荐
- Unable to resolve target 'android-20'
使用eclipse编写android的app时,出现错误:Unable to resolve target 'android-20'. 参看链接: http://blog.csdn.net/u0134 ...
- CentOS查看本机公网IP命令
icanhazip.com 使你在任何地方知道你的公网IP地址 icanhazip.com是一个网址,你在浏览器中输入这个网址,你就能得到你的公网IP地址了. 我在Linux下一般使用curl ica ...
- MVC+LINQToSQL的Repository模式之(二)数据基类
namespace Data.TEST{ /// <summary> /// 数据操作基类 /// </summary> public abstract ...
- jQuery页面刷新(局部、全部)问题分析
本文实例分两部分对jquery刷新问题进行介绍,第一部分介绍了呢页面局部刷新:第二部分介绍了页面全部刷新第一:页面局部刷新 jQuery对Ajax操作进行了封装,在jQuery中$.ajax()方法属 ...
- ModelState.AddModelError使用
后台: ModelState.AddModelError("userPwd", "请输入密码!"); ModelState是一个字典类型,这句话的作用是向Mod ...
- The Rox Java NIO Tutorial
FQ之后访问 http://rox-xmlrpc.sourceforge.net/niotut/
- spring 事物管理没起到作用
今天在做项目的时候发现配置的spring 事物管理没起到作用.可是配置又是依据官网配置的,不可能会错.最后发现使mysql的问题 普通情况下,mysql会默认提供多种存储引擎,你能够通过以下的查看: ...
- CentOS7.1 Liberty云平台之Dashboard篇(7)
控制节点: 一.安装及配置Dashboard 1.安装dashboard相关包 yum install openstack-dashboard 2.配置/etc/openstack-dashboard ...
- Java输入输出流(2)
6. Java.IO流类库 1. io流的四个基本类 java.io包中包括了流式I/O所须要的全部类. 在java.io包中有四个基本类:InputStream.OutputStream及Reade ...
- Android性能优化的一些方案
优化Dalvik虚拟机的堆内存分配 1)首先内存方面,可以参考 Android堆内存也可自己定义大小和优化Dalvik虚拟机的堆内存分配 对于Android平台来说,其托管层使用的Dalvik Jav ...