构建脚本概要
Gradle构建脚本中最重要的两个概念是project和Task,任何一个Gradle构建都由一个或多个project组成,每个project包括许多的构建部分,可以是一个jar包,也可以是一个web应用,也可以是多个jar包的整合,可以部署应用和搭建环境。
每个project 由一个或多个task组成,每个Task表示在构建执行过程中的一个原子操作。如编译、打包,生成JavaDoc ,发布到仓库等。
project与project,project与Task,task与task之间的关系如下图所示:
Project1依赖Project2,所以需要先构建Project2,Project2中有三个Task FGH,按照依赖关系,先执行TaskG,在执行taskF,在执行TaskH,Project1中的Task也是按照这个依赖关系顺序执行
project对象介绍
一个project代表一个正在构建的组件(jar/war文件),当构建开始时,Gradle会基于build.gradle实例化一个org.gradle.api.Project对象,并通过project变量来隐式调用其成员。
Project其他常用配置:
- plugins apply plugin 用来引入插件使用
- dependencies 依赖配置
- repositories 仓库配置
- task 任务
- ext.gradle.properties 加入额外的属性
所有的配置都会被封装到Project对象中,然后通过属性中的project实例来调用
Task 任务介绍
每个任务在构建执行中会被封装成 org.gradle.api.Task对象,主要包括任务的动作和任务依赖。任务动作定义了一个原子操作,可以定义依赖其他任务、动作顺序和执行条件。
任务主要操作动作:
dependsOn: 依赖相关操作
doFirst: 任务执行之前的方法
doLast, <<: 任务执行之后的方法
实战演示任务的书写
我们基于上一节中创建的gradle项目,直接在build.gradle文件中书写,
代码如下:
//演示任务的书写
task t1 {
println "hello t1"
}
task t2(dependsOn: 't1') {
//t2执行之前的操作
doFirst {
println 't2 do first'
}
println 'hello t2'
//t2执行之后的操作
doLast {
println 't2 do last'
}
}
写完任务,我们尝试执行下,首先点击下刷新按钮
我们双击build 看下执行结果
16:51:35: Executing task 'build'...
> Configure project :
hello t1
hello t2
> Task :compileJava UP-TO-DATE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :jar UP-TO-DATE
> Task :assemble UP-TO-DATE
> Task :compileTestJava NO-SOURCE
> Task :processTestResources NO-SOURCE
> Task :testClasses UP-TO-DATE
> Task :test NO-SOURCE
> Task :check UP-TO-DATE
> Task :build UP-TO-DATE
BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 up-to-date
16:51:36: Task execution finished 'build'.
从输出结果中,我们可以看到,构建project 只执行了 task内部的操作,并没有执行doFirst 和 doLast
我们在双击other下的t1 看下执行结果:
16:55:00: Executing task 't1'...
> Configure project :
hello t1
hello t2
> Task :t1 UP-TO-DATE
BUILD SUCCESSFUL in 0s
16:55:01: Task execution finished 't1'.
我们在双击other下的t2 看下执行结果:
16:54:04: Executing task 't2'...
> Configure project :
hello t1
hello t2
> Task :t1 UP-TO-DATE
> Task :t2
t2 do first
t2 do last
BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
16:54:04: Task execution finished 't2'.
根据输出结果,其中
> Configure project :
hello t1
hello t2
这个log是构建project的输出,在执行任务时会先配置project
Task :t2
t2 do first
t2 do last
执行t2任务时,doFirst和doLast执行了
由此实验我们可以得出结论:
直接定义在任务下的代码会在配置project时执行,其他时候不执行,就算是依赖也不执行。只有在doFirst和doLast的操作才会在调用任务或者依赖执行时调用。所以自定义任务的代码需要写在doFirst或 doLast中,除非现在构建Project时就执行。