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代码的时候是懵逼的,

gsfdtrysrtsfdg.jpg

这是哪门子语言,这到底是类似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???

冷静一下。。。

cce4b48f8c5494ee7008eb9528f5e0fe98257eca

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




本文转自 sshpp 51CTO博客,原文链接:http://blog.51cto.com/12902932/1928050,如需转载请自行联系原作者
相关文章
|
4月前
|
Java 程序员 API
Gradle笔记 二 Gradle的基础Groovy
Gradle笔记 二 Gradle的基础Groovy
46 0
|
5月前
|
Java 测试技术 Scala
[√]groovy / gradle学习
[√]groovy / gradle学习
32 0
|
8月前
|
Java Shell 数据处理
Android 根目录下和应用目录下的build.gradle的详解,以及groovy语法的讲解
Android 根目录下和应用目录下的build.gradle的详解,以及groovy语法的讲解
154 0
|
XML JSON JavaScript
Gradle筑基篇(二)-groovy语法详解
大家回想一下自己第一次接触`Gradle`是什么时候? 相信大家也都是和我一样,在我们打开第一个AS项目的时候, 发现有很多带gradle字样的文件:`setting.gradle, build.gradle,gradle.warpper`,以及在`gradle`文件中各种配置, 这些都是啥wy啊。
|
Java 测试技术 程序员
|
Java API 索引
Gradle从0入门到实战系列【二】Groovy And Gradle
要学好Gradle,我们需要简单的学习Groovy的基础语法和闭包。Groovy 是一种基于 JVM 的动态语言,他的语法和 Java 相似,最终也是要编译 .class 在JVM上运行。Groovy 完全兼容 Java 并且在此基础上添加了很多动态类型和灵活的特性,比如支持闭包,支持DSL(领域特定语言),是一门非常灵活的动态脚本语言。
280 0
Gradle从0入门到实战系列【二】Groovy And Gradle
|
缓存 Android开发
【Groovy】Gradle 环境搭建 ( 下载 Gradle 工具 | 查找本地缓存的 Gradle 工具 | 配置 Gradle 环境变量 )
【Groovy】Gradle 环境搭建 ( 下载 Gradle 工具 | 查找本地缓存的 Gradle 工具 | 配置 Gradle 环境变量 )
300 0
【Groovy】Gradle 环境搭建 ( 下载 Gradle 工具 | 查找本地缓存的 Gradle 工具 | 配置 Gradle 环境变量 )
|
XML IDE Java
【Groovy】Gradle 构建工具 ( 自动下载并配置构建环境 | 提供 API 扩展与开发工具集成 | 内置 Maven 和 Ivy 依赖管理 | 使用 Groovy 编写构建脚本 )
【Groovy】Gradle 构建工具 ( 自动下载并配置构建环境 | 提供 API 扩展与开发工具集成 | 内置 Maven 和 Ivy 依赖管理 | 使用 Groovy 编写构建脚本 )
239 0
【Groovy】Gradle 构建工具 ( 自动下载并配置构建环境 | 提供 API 扩展与开发工具集成 | 内置 Maven 和 Ivy 依赖管理 | 使用 Groovy 编写构建脚本 )
|
XML Java Maven
【Groovy】构建工具 ( 构建工具引入 | Gradle 构建工具作用 | 传统的依赖管理 )
【Groovy】构建工具 ( 构建工具引入 | Gradle 构建工具作用 | 传统的依赖管理 )
126 0
|
Android开发
Gradle指南之从Groovy迁移到Kotlin
### 前言 最近写 Kotlin 写的有些着魔了,正好看到 Gradle 4.10 版本支持使用 Kotlin DSL 构建脚本,然后心血来潮的尝鲜了下,因为刚出来,相关的资料实在太少,**实际在迁移过程遇到不少问题,所以本文可能是第一篇非官方迁移指导文档,希望可以 save your time !** 好了,话不多说,马上开始迁移(踩坑)之旅 ### 准备工作 1. 确认你的
1901 0