Gradle杂谈

1,147 阅读4分钟

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的来源有三种
  1. Gradle默认自带task
名称 作用
Dependencies 显示Project的依赖信息
Projects 显示所有Project,包括根Project和子Project
Properties 显示一个Project所包含的所有Property
  1. 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"
}
  1. 以plugin的方式引入
apply plugin: 'groovy'

Property:属性

Project除开包含Task外还包含Property,Property默认自带了一些属性,也可以通过ext.XXX的方法来扩展。

Gradle的生命周期

一次Gradle的生命周期为三个阶段

  • 初始化阶段:解析setting.gradle并遍历根目录,检查子项目是否满足

  • 配置阶段:解析每个子project的gradle,根据task之间的关系创建有向无环图

  • 执行阶段:根据目标task的依赖顺序执行

    Gradle的执行周期

参考资料

blog.csdn.net/yejingtao70…

www2.zhihu.com/question/27…