文档章节

Gradle这个黑盒子

林泳坛
 林泳坛
发布于 2015/08/22 00:22
字数 1031
阅读 171
收藏 11

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不同的莫过于两点,

  1. dependencies是定义在Project中的,而dependencies2是在脚本中定义的。
  2. dependencies向闭包参数委派的对象是DependencyHandler对象,而dependencies2向包参数委派的对象是DependencySpec对象。

所以在编写build.gradle脚本的时候,多点查看所调用的函数向闭包中委派了什么对象。

另外各位看官可以看下这两篇文章Understanding GradleGradle学习系列之三——读懂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大量使用了闭包模式,构建过程中涉及的配置,无非就是通过闭包的委派模式,把需要设置的对象传到闭包中,让开发者自己决定怎么设值。至于设值的方式就方法调用啰,或者变量赋值啰。

原文

© 著作权归作者所有

林泳坛
粉丝 3
博文 18
码字总数 13321
作品 0
广州
程序员
私信 提问
简论可拔插系统的重要性

1、其实人类是个可拔插系统,可以换脑袋,可以移植器官 2、oracle实现了拔插版 3、我们的项目太过混论,简直不可拔插,而是在重构,简难地分离,复杂地COPY改 4、我们试图构造复杂的运行时对...

快速开发师
2016/09/22
230
3
Learn Gradle - CH 2 基本的构建脚本介绍

1、项目和任务 Gradle 构建脚本包括两个最基本的概念,就是项目(projects)和任务(tasks)。 项目是指我们的构建产物(比如jar包)或实施产物(比如web application等)。Gradle构建脚本包...

Hassan
2015/07/12
425
0
AndroidStudio gradle安装配置详解-透过现象看本质

背景 相信很多人第一次安装androidstudio跑工程时候,会遇到一个问题:android sutdio第一次打开一个工程巨慢怎么办? 或者是gradle project sync filded错误 有没有想过androidstudio是如何...

u010321471
2018/05/27
0
0
Gradle核心思想(四)看似无用,实则重要的Gradle Wrapper

本文首发于微信公众号「刘望舒」 原文链接:看似无用,实则重要的Gradle Wrapper 关联文章 Gradle核心思想(一)为什么现在要用Gradle? Gradle核心思想(二)Gradle入门前奏 Gradle核心思想...

刘望舒
03/21
0
0
android studio配置sdk和gradle中的一些问题

因为最近在家里也要搞一下android项目,家里笔记本上一直装的Eclipse,心血来潮给装上了as。创建项目,配置sdk,gradle环境,又是一个蛋疼的过程。几经周折终于build gradle finished之后,为...

shenhuniurou
2016/04/13
3.5K
0

没有更多内容

加载失败,请刷新页面

加载更多

Netty整合Protobuffer

现在我们都知道,rpc的三要素:IO模型,线程模型,然后就是数据交互模型,即我们说的序列化和反序列化,现在我们来看一下压缩比率最大的二进制序列化方式——Protobuffer,而且该方式是可以跨...

算法之名
11分钟前
9
0
如何用C++实现栈

栈的定义 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压...

BWH_Steven
30分钟前
3
0
编程作业20190210900169

1编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来。 #include <stdio.h>#include <stdlib.h> int main(){ char firstName[20]; char lastName[20]; print......

1李嘉焘1
42分钟前
6
0
补码的优点及原理分析

只讨论整数 1.计算机内部为什么没有减法器? 减法运算本身其实就是加法,如x - y即x +(-y),所以只需要将负数成功表示出来并可以参加加法运算,那加法器就可同时实现“+”和“-”的运算。这...

清自以敬
57分钟前
75
0
Docker 可视化管理 portainer

官网安装指南: https://portainer.readthedocs.io/en/latest/deployment.html docker-compose.yml 位置,下载地址:https://downloads.portainer.io/docker-compose.yml...

Moks角木
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部