Gradle构建之生命周期

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

项目结构

gradle项目目录结构:

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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!