Gradle-02 构建原理

构建脚本概要

  1. Gradle 构建脚本中最重要的两个概念是projectTask ,任何一个Gradle构建都一个或多个project组成,每个 project 包括许多的构建部分,可以是一个 jar 包,也可以是一个web应用,也可以是多个 jar 的整合,可以部署应用和搭建环境
  2. 每个 project 由一个或多个 Taks 组成,每个 Task 表示在构建执行过程中的一个原子操作 。如编译 打包 生成 javadoc 发布到仓库等操作
  3. 依赖关系
    • Task间,有依赖关系,先构建被依赖项,如 Task A依赖与 Task B,则先构建Task B,再构建Task A
    • Project间,有依赖关系,也是先构建依赖项,如 Project1 中的 Task C 依赖与(depends on)Project2中的Task D,Project2 中 Task D 又依赖Task E,则构建顺序为,(Project2)Task E → (Project2)Task D → (Project1)Task C

Project 对象介绍

  1. 一个 project 代表一个正在构建的组件(jar/war文件),当构建开始时,Gradle 会基于 build.gradle 实例化一个org.gradle.api.Project对象 ,并通过 project变量 来隐式调用其成员,成员如下:
名字 类型 默认值
project Project Project 实例
group Object 项目分组:未指定
name String 项目目录名
version Object 项目版本:未指定
path String 项目绝对路径
description String 项目描述
projectDir File 包含生成脚本目录
buildDir File projectDir/build
ant AntBuilder AntBuilder 实例
  1. Project 中常用的属性有 project(即build.gradle本身),group,name,version

  2. Project 其他常用的配置

  • plugins,apply plugin 用来引入插件使用
  • dependencies 依赖配置
  • repositories 仓库配置
  • task 任务书写
  • ext,gradle.properties Project 中属性的其他配置方式
  1. 所有的配置都会被封装到一个Project的实例对象中,build.gradle 中任何无主的方法 都会去Project 类中查找,即 Project 是build.gradle中的无主方法的隐式对象,类似与Java中的this

Gradle 项目构建生命周期

  1. Initialization(初始化阶段),通过settings.gradle 判断有哪些项目需要进行初始化,加载所有需要初始化的项目的build.gradle 文件并为每个项目创建project 对象

  2. Configuration(配置阶段),扫描各项目下的build.gradle 脚本,对project 进行配置(执行哪些任务,运行哪些插件,执行哪些逻辑),并且构造Task 任务关系依赖图 以便在执行阶段按照依赖关系执行Task中的配置代码(如println方法)

  3. Execution(执行阶段),通过配置阶段的 Task 图,按顺序执行需要执行的 任务中的动作代码,就是执行doFirstdoLast 等代码

task任务介绍

  1. 每个任务在构建执行过程中会被封装成 org.gradle.api.Task 对象,主要包括任务的动作任务的依赖 .任务动作定义了一个原子操作 ,可以定义依赖其他任务动作顺序执行条件 ,与任务相关的操作如下
  • dependsOn :依赖相关操作
  • doFirst :任务执行之前的方法
  • doLast << 任务执行之后的方法
  1. 生命周期介绍
  • Initialization

    • 读取项目信息,确定是单项目还是多项目工程,然后确认哪些项目是要参与进来,并为他们创建Project 实例,一般我们不会接触
  • Configuration(构建阶段)

    • 进行配置,从头到尾将build.gradle脚本跑一遍。不运行项目,只是对构建进行一些配置,本质就是对build.gradle执行一次,例如执行哪些任务,运行哪些插件,执行哪些逻辑
  • Execution

    • 运行阶段。具体执行哪些task,可以使用./gradlew task_name 执行单个任务,如果单个任务中依赖doLast或doFirst等钩子函数中的其他任务,则其他被依赖的任务也会被调用执行;如果使用build 则只是构建项目,在Configuration 阶段扫描一下配置,并不会执行其依赖的任务 但是,若任务参数显示使用dependsOn 某个任务,则依赖的任务会执行
  • 构建只会执行普通语句,执行阶段才会调用钩子函数(doLast等)

    • 在命令行使用./gradlew task_name 代表构建项目、执行任务 ,会有两个阶段,Configuration 阶段会执行任务中的类似与println 语句,然后在Execution阶段会执行doFirst或doLast等钩子函数 ,如果单个任务中依赖doLast或doFirst等钩子函数中的其他任务,则其他被依赖的任务也会被调用执行;
    • 如果使用build只是构建项目,在Configuration 阶段扫描一下配置,执行内部的相关语句,并不会执行其依赖的任务 但是,若任务参数显示使用dependsOn 某个任务,则被依赖的任务会执行
  1. 生命周期应用
  • Task。task是gardle中最小的任务单元,任务之间可以进行复杂的操作(动态创建任务,多任务间依赖调用)
    • 用法。task('helloworld',Closure closure),helloworld 即当前任务的名字,closure闭包作用是对helloworld 任务进行Configuration ,使用命令./gradlew helloworld构建并执行任务 可以在closure 中调用doLast或dependsOn等方法。我们可以在helloworldConfiguration 期间进行wrapper(例如,调用其他任务,或者动态调用任务等)
    • dependsOn方法,方法参数为其他任务的名字。多任务中通过该方法可执行所依赖的其他任务
    • doLast,在生命周期的configuration阶段,将doLast闭包函数放在任务的最后,并不执行 ,执行任务时(命令行执行./gradlew task_name 或IDE的gradle插件单击指定task),会调用该方法。doFirst相反
  1. 任务的依赖配置dependsOn ,先执行依赖任务,再执行本任务
  • 任务参数依赖,先执行参数中的依赖,再执行本任务
  • 任务内部依赖,先执行依赖的任务,再执行本任务
  • 外部添加依赖,先执行依赖的任务
  1. 动态任务
4.times{val ->
	task"tk${val}"<<{
		println "this task name is task${val}"
	}
}
  1. 给任务自定义属性
task t1{
		ext.myProperty="task's property"
		doFirst{
			println("t1 ${myProperty}")
		}
}
//输出,t1 task's property

原文地址:https://www.cnblogs.com/luckyCoder/p/12732459.html