Gradle简介
Gradle是基于脚本语言的构建系统,跟Ant、Maven一样能够简化你的编译、打包、测试过程。在Java领域,Gradle跟Maven是用的最多的两种构建工具。Gradle的比重之所以这么大Android项目贡献了大部分力量。在纯Java后端领域,Maven还是占优的。
Gradle和Maven对比
在网上对Gradle的评价褒贬不一,批评的一无是处的有,持肯定态度的也大有人在。这里抛开情绪化从客观的角度的简单罗列各自的一些优缺点。
Maven的优点
- 稳定可靠,通过统一的流程来完成工作,在绝大多数项目上工作良好。
- 社区很大,插件很多很丰富。这其实是构建最大的意义所在,不要什么魔法,老老实实干活就好。
Maven的缺点
- 太死板了,以至于哪怕要偏离主线一点点,都要付出巨大的代价
- Maven团队是一个非常松散的、社区驱动的团队,对新功能的兴趣不大
- 对于大项目,Maven太慢了,Maven原生的up-to-date检查只看时间戳,实践中大家都习惯clean package,所以每次构建基本上都是全量构建
Gradle的优点
- 脚本语言,足够灵活,但是这个灵活是不是优点呢……不同的人看法相差很大,
自由不是免费的,你接受了自由,就要付出代价
Gradle的缺点
- 庞大臃肿,冷启动一下太慢
- 概念繁多复杂,学习曲线陡峭
- 变化太快,社区跟不上
安装gradle
安装gradle之前确保正常安装jdk。
下载gradle的二进制包,解压。然后把bin目录的路径添加到环境变量中的path变量中, 最后命令行执行gradle --version就能查看gradle的安装版本信息。
gradle下载地址:services.gradle.org/distributio…
Gradle与Gradle-wrapper关系
打开下载地址后发现每个版本都会有wrapper、bin、src、doc、all这五种类型的包。其中bin只包含二进制可执行文件;src为源文件;doc为离线文档;all则包含二进制、源文件和离线文档。
那wrapper文件又是什么呢,和普通的gradle二进制文件有什么区别及关联呢。原来因为gradle版本更新迭代太迅速,导致很多新版本的插件必须依赖高版本的gradle,此时则需要更新下载gradle的版本从而变的比较麻烦。因为本身引入gradle的目的就是希望让构建项目变的轻松。如果这样岂不是与初衷背道而驰。所以引入了gradle-wrapper,只需要读取配置文件中gradle的版本,为每个项目自动的下载和配置gradle,这样就简单了。
Gradle的基本构建快
Project:项目
每个项目都会有自己的gradle领域,配置脚本文件名默认是build.gradle
Project之间如果出现父子关系,只有根Project才会有setting.gradle配置文件,该配置文件的作用是声明其包含的子项目
Task:任务
每个Project是由N个Task组织成的一个“有向无环图”,task之间有依赖关系从而决定了它们的执行顺序。
Task的来源有三种
- Gradle默认自带task
| 名称 | 作用 |
|---|---|
| Dependencies | 显示Project的依赖信息 |
| Projects | 显示所有Project,包括根Project和子Project |
| Properties | 显示一个Project所包含的所有Property |
- project中显式创建
//定义 task , 名字 hello
task hello{
println "hello world"
doLast{
println "hello world doLast"
}
}
//定义 task,名字 hello
task(hello2){
println "hello world2"
}
//定义 task,名字 hello3
task ('hello3'){
println "hello world3"
}
- 以plugin的方式引入
apply plugin: 'groovy'
Property:属性
Project除开包含Task外还包含Property,Property默认自带了一些属性,也可以通过ext.XXX的方法来扩展。
Gradle的生命周期
一次Gradle的生命周期为三个阶段
-
初始化阶段:解析setting.gradle并遍历根目录,检查子项目是否满足
-
配置阶段:解析每个子project的gradle,根据task之间的关系创建有向无环图
-
执行阶段:根据目标task的依赖顺序执行
参考资料