Gradle是一个框架,作为框架,它负责定义流程和规则。而具体的编译工作则是通过插件的方式来完成的。比如编译Java有Java插件,编译Groovy有Groovy插件,编译Android APP有Android APP插件,编译Android Library有Android Library插件。Gradle中每一个待编译的工程都是一个Project,一个具体的编译过程是由一个一个的Task来定义和执行的。一个Project到底包含多少个Task,其实是由编译脚本指定的插件决定。插件是什么呢?插件就是用来定义Task,并具体执行这些Task的东西
项目结构
gradle项目目录结构:

除了build.gradle(构建的说明书)其他的文件是gradlewrapper相关的
Gradle的生命周期
gradlelifecycle:
-
initialization:执行两个脚本init.gradle , settting.gradle; init用于创建全局的Gradle对象 判断是单项目构建还是多项目构建;Setting用于「决定哪些项目参与到构建中,为每个项目创建一个Project」
init.gradle是当前机器所有Grdale所有项目公用的,「配置全局的init.gradle文件」需要放在GRADLE_USER_HOME指代的gradle文件夹的init.d下面。
init.d中的init.gradle有initscript 脚本块,和普通gradle不一样的是执行脚本会先调用initscript 方法,可在此处添加三方依赖。
跟项目只有.gradle有意义,每个Gradle项目都必须有一个.gradle构建脚本,在之后的配置阶段会根据这个构建脚本的内容去创建对应的Projcet对象
-
Configuration配置阶段:「执行build.gradle文件」【创建task,「执行task的闭包去配置这个task的Action」】,对上一步生成的「project进行设置」(有哪些任务,任务之间的依赖,应用了哪些插件等)
Action其实就是doLast,doFirst这些。配置阶段去配置这个task的Action及各个task之间的依赖关系,对Projcet添加Task,等到执行阶段的时候在执行Task里面的Action
-
Execution:执行阶段,针对project 「真正的运行task,根据配置阶段生成的task依赖和添加任务列表进行执行」
「gradle执行的最小单元是task任务,任何无主函数都可以在Project中找到」
Task创建示例
//使用闭包去填充这个task1任务,添加内部的Action到任务的执行列表中,
//配置阶段确定task包含哪些Action及Tasl的依赖关系
task("task1"){
print('Config')
doLast{
//把当前闭包添加到这个任务执行列表的最后,并不执行这个任务
//task每次执行都需要经历三个阶段。因此执行其他task的时候不会执行这个doLast里
print('Executing')
}
}
比如denpendes依赖其他task,在执行这个task之前会先执行依赖的task。
特殊的钩子函数
「钩子函数」并不会像普通task一样按照从上到下的顺序执行,他的执行依赖于特定的方法,比如afterEveluatetask,这个task的执行时机是在配置完成阶段将build.gradle都执行完的时候去执行的(当然也会执行普通task闭包用于确定配置这个task)。
「在配置阶段碰到这类task的时候会把它们添加到一个待执行的列表中,等待合适时机在调用。」
「调用完钩子函数之后就进入到了Eveluate阶段,这个阶段会去执行gradlew指定的task任务,也就是执行配置阶段已经配置了这个task的任务列表」
Task的type属性
type属性用于「创建指定task,从而可以使用这个Task内的方法」。
比如copy这个系统的task,我们创建的task的type属性指定了copy,那么在我们创建的task闭包中就可以使用一系列copytask的方法
比如:
//数据源目录,多个目录
public AbstractCopyTask from(Object… sourcePaths)/
//目标目录,单一
public AbstractCopyTask into(Object destDir)
//过滤文件 包含
public AbstractCopyTask include(String… includes)
//过滤文件 排除
public AbstractCopyTask exclude(String… excludes)
//重新命名,老名字 新名字
复制图片:多个数据源 –>
public AbstractCopyTask rename(String sourceRegEx, String replaceWith)
task copyImage(type: Copy) {
from ‘C:Usersyiba_zyjDesktopgradlecopy’ ,
‘C:Usersyiba_zyjDesktopgradlecopy’
into ‘C:Usersyiba_zyjDesktop’
}
复制文件:过滤文件,重命名 –>
task copyImage(type: Copy) {
from ‘C:Usersyiba_zyjDesktopgradlecopy’
into ‘C:Usersyiba_zyjDesktop’
include “*.jpg”
exclude “image1.jpg”
rename(“image2.jpg”,”123.jpg”)
}
原文始发于微信公众号(北洋洋洋):Gradle构建之生命周期
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/76079.html