Gradle 简单入门
Gradle
通用自动化构建工具
Gradle Wrapper
Gradle官方推荐构建脚本,简称Wrapper
主要内容:启动jvm加载gradle-wrapper.jar,下载gradle兼容版本,工作流程如下图:
GRADLE_USER_HOME
默认~/.gradle/
~/.gradle/init.d全局脚本
~/.gradle/caches/类似maven的.m2
Gradle Daemon
Gradle 在 Java 虚拟机 (JVM) 上运行的,需要使用多个需要大量初始化时间的支持库。Gradle Daemon主要解决启动慢问题。
启动机制与Maven对比如下:
Maven:启动jvm加载后销毁
Gradle:Client JVM(接收请求、转发请求)查找并和deam jvm通信
Geman JVM:构建结束后client jvm销毁,deman jvm一直存在。
兼容性:不兼容情况下,由Client JVM创建新的Deman JVM;空闲3小时Deman自动退出
关闭deman 使用启动参数--no deman(maven)
例如:Compile Java大概流程
1.启动轻量JVM查找当前机器是否安装对应版本Gradle,没有安装,下载兼容版本Gradle到GRADLE_USER_HOME中
2.安装后,查找对应版本Gradle的Deman JVM进程,若没有找到,启动Deman JVM,否则连接Deman(socket)发送当前环境变量等到Deman JVM,Deman主要处理构建。
Gradle 构建声明周期
构建三个阶段,官网说明:
Initialization Gradle supports single and multi-project builds. During the initialization phase, Gradle determines which projects are going to take part in the build, and creates a Project instance for each of these projects. Configuration During this phase the project objects are configured. The build scripts of all projects which are part of the build are executed. Execution Gradle determines the subset of the tasks, created and configured during the configuration phase, to be executed. The subset is determined by the task name arguments passed to the gradle command and the current directory. Gradle then executes each of the selected tasks.
初始化
渐变支持单个和多个项目构建。在初始化阶段,Gradle决定哪些项目将参与构建,并为每个项目创建一个项目实例。
配置
在此阶段,将配置项目对象。执行构建的所有项目的构建脚本都被执行。 (按照groovy从上到下执行build.gradle脚本)
执行
Gradle决定在配置阶段创建和配置任务的子集,以执行。子集由传递给level le命令和当前目录的任务名称参数决定。然后,渐变执行每个选定的任务。
动态调用以及闭包
闭包简单使用,create helloword
task("test" , { print("config") doLast { print('Executing task') } })
首先创建名为helloword的Task,通过closure闭包配置helloword Task(Task调用闭包,本质groovy的delegate机制)
执行doLast()把当前的闭包添加到task的执行列表末尾。并不真正执行它
基于Groovy实现,感兴趣的可以参考 groovy in action2
核心模型
Project Interface
在Gradle大部分无主方法,可以参考Project
afterevalue()钩子函数,对project实例创建完成后操作,以及对应的beforeevalue()
allproject()多项目构建对所有的project执行操作
buildScript()构建函数
file()、fileTree()读取文件
findProject()多项目中查找项目实例
findproperty()查找属性
getBuildDir()当前项目build目录,默认项目buil目录,存放项目输出
...
Task
静态定义 = 动态定义
静态,例: task("test" , { print("config") doLast { print('Executing task') } }) 动态,例: for (i in 0..<10) { task("test" + i , { print("config") doLast { print('Executing task') } }) }
结论:执行静态定义和动态定义的Task完全一样
Lifecycle和Hook
afterEvaluate {//闭包(函数)放到执行列表不立刻执行,直到触发afterValuate()执行 print('after evalueate') }
注:在gradle的构建过程中,在configuration阶段gradle执行引擎从上到下执行build.gradle文件,执行后
成为完成evaluate,这时执行afterEvaluate()函数
插件编写
gradle核心由插件组成,插件:逻辑的抽取打包
定义插件
class myPlugin implements Plugin<Project> { @Override void apply(Project project) { (0..<10).each {i -> project.task('task' + i ) { def capturedI = i doLast { print("Executing task + ${capturedI}") } } } } }
引入插件
apply plugin: myPlugin
注:本质是执行插件apply()封装逻辑
BuildScript
涉及Compile Scan以及Build Scan,因此会涉及多个Classpath,在build.gradle运行之前如果存在BuildSrc默认会首先将BuildSrc文件打包放到BuildSrc中的Classpath中(Gradle规定)
Maven→Gradle
安装Gradle后,执行gradle init
Maven 构建没有很多插件或自定义方式,使用gradle build即可