gradle 知识(1) – gradle构建工具
本文作为gradle的第一篇,gradle的重要性就不用说了。接下来介绍一下本系列博客的主要思路和参考内容,初步的想法是分五篇来进行介绍gradle
(1) gradle构建工具
(2) groovy语法
(3) gradle基本知识
(4) gradle 插件
(5) android Studio 中使用
参考书籍或者文档或博客
1.gradle-user-guide使用书册中文版(gradle使用书册,网上可以下载)
2.Android Grale权威指南(书籍,个人觉得没必要买)
3.大神的博客 (参考博客会附上网址)
1.gradle 介绍
Gradle, 这是一个构建系统, 我们认为它是 java ( JVM )世界中构建技术的一个飞跃.总之,gradle就是一个构建工具
Gradle的特点:
- 一个像 Ant 一样的非常灵活的通用构建工具
- 一种可切换的, 像 maven 一样的基于合约构建的框架
- 支持强大的多工程构建
- 支持强大的依赖管理(基于 ApacheIvy )
- 支持已有的 maven 和 ivy 仓库
- 支持传递性依赖管理, 而不需要远程仓库或者 pom.xml 或者 ivy 配置文件
- 基于 groovy 的构建脚本
- 有丰富的领域模型来描述你的构建
2.Gradle和Makefile的对比
参考地址: Jhuster大大的博客http://ticktick.blog.51cto.com/823160/1688586
Makefile对于linux的程序员可以说是不能在熟悉了吧,但是对于我这种只会简单linux驱动,一个只会写小c项目的arm菜鸟来说自己写的Makefile和内核的Makefile感觉就不是一个语言。但是Makefile对于Linux c/c++项目的构建是起到了决定性的作用,毕竟是用来构建内核的工具,我们要介绍的gradle也是一种构建工具。两者有什么区别那? Makefile主要用于linux c/c++ ,gradle主要用于java
2.1 Makefile构建
hello.c文件的Makefile
#Makefile,它是由一个个"规则"组成,每个"规则"都是由"目标"、"依赖"、"命令"构成
all: hello
hello: hello.c
gcc -o hello hello.c
clean:
rm hello
当执行”make”命令时,编译器会默认查找目标”all” ,如果没有”all”则会查找Makefile文件的第一个目标。本示例中有”all”目标,它依赖”hello”目标,因此编译器会转而先构建”hello”目标,构建前, 编译器会先检测”hello”目标是否需要更新(通过判断”hello”文件与它所依赖的源文件”hello.c”的修改时间),如果需要,则执行后面的命令,而需要编译的源文件则是通过手动或者相关函数的方式添加到编译命令的参数中去的
makefile最核心的构建思想,通过一个个”目标”、”依赖”、”命令”来完成整个项目的关联和编译,那么Gradle是怎么实现的。对于了解makefile的可能知道我什么意思,没有接触过的可能不知道我说什么,大家可以了解下makefile来学习两者的区别
2.Gradle
1. gradle是如何识别源文件的?
Gradle是采取了一种”约定优于配置”的思想来完成这一点的,它通过”Plugin”来约定项目的目标和源文件的布局,简单的说,每种源码,资源文件放在哪个路径下是确定的,我们配置好的
2.gradle是如何编译目标的?
在Gradle中,与Makefile的”目标”相对应的概念是”任务”,即”task”,Gradle的构建过程,就是执行一条一条”task”任务的过程, 同样,一个”task”也是可以依赖另一个”task”的,这样,通过这种依赖关系,就可以将整个项目中各个”task”链接到一起了。task的概念我们接下来会说,这里你可以理解为一个动作,比如编译源码或者复制文件到另外一个路径下等等,那为什么要依赖那,我们这里有两个task,taska是编译源码,taskb是测试程序,那必须是taska执行完毕才可以执行taskb
3.总结
在这里,我们只要明白gradle是一个针对java的构建工具。编译一个大项目有成百上千个源代码,这些代码时如何存放的,我们的编译工具如何去识别存放位置,(Makefile直接存放在本路径下,在通过gcc编译期间会通过文件名指定)(Gradle是通过固定的配置识别的);那这些文件是如何依赖的(依赖就是当我编译一个目标a时,使用到了b,c,但是b和c都不能直接通过单个源码编译得到,如果是单个源码,makefile有默认编译规则,所以必须要有b和c的编译规则,必须编译完了b和c才可以得到我们的总目标a),gradle就是依靠多个task之间的依赖来确定的,要执行a,必须先执行b,这就是a依赖于b