Gradle系列8-gradle构建脚本的介绍

构建脚本概要

Gradle构建脚本中最重要的两个概念是projectTask,任何一个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其他常用配置:

  1. plugins apply plugin 用来引入插件使用
  2. dependencies 依赖配置
  3. repositories 仓库配置
  4. task 任务
  5. 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时就执行。

发布了159 篇原创文章 · 获赞 22 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/ytuglt/article/details/104984616