Gradle构建框架

前面我们已经简单学习了Groovy语言,我们知道Gradle工程的配置文件语法其实就是Groovy的配置脚本,Gradle构建工程时会调用这些配置脚本,脚本又调用Gradle提供的API,最终实现可配置的构建流程。这篇笔记我们详细学习Gradle框架提供的各种功能。

工程构建生命周期

Gradle中,工程构建生命周期分为3部分:

Initializing:初始化阶段,从Gradle全局配置和工程中的settings.gradle等处,加载全局属性、仓库信息、模块信息等。

Configuration:按依赖顺序依次处理各工程模块,根据build.gradle生成task。

Execution:根据task执行具体的构建逻辑。

settings.gradle

settings.gradle配置文件放置在工程根目录下,用于在Initializing阶段指定工程中的模块信息,包括当前模块和子模块。下面例子中,我们的父工程是demo,拥有两个子模块userorder

rootProject.name = 'demo'
include 'user'
include 'order'

通常来说,我们的模块文件夹名就是模块名,例如demo/user文件夹就是demo模块的user子模块,当然这并不是必须的,但推荐这样做。

注:如果子模块还有子模块,可以用冒号分隔,例如include 'proj:subproj'

build.gradle

build.gradle中包含和具体构建相关的配置脚本。其中主要包含如下几大块配置:

  • groupversion:模块的组名和版本号
  • plugins {}:插件
  • repositories {}:依赖仓库
  • dependencies {}:具体依赖项

除此之外,具体到工程中,我们使用的插件也会引入一些可配置项,比如java插件会额外引入sourceCompatibilitytargetCompatibility来指定编译和运行兼容的JDK版本。

Task 构建任务

Task可以理解为构建过程中的一个具体环节,比如代码编译、拷贝资源文件等,我们使用Gradle其实就是调用其中的各种Task。

Gradle框架本身只包含一些基本的Task,而编译任务等由java等插件具体实现。除了自带Task和插件Task,我们也可以定义自己的Task。

查看当前有哪些Task可用

当然,Eclipse等IDE会给我们以图形界面方式列出哪些Task可用。不过实际上Gradle命令行也对这类功能有着完善的支持,如下命令可以列出当前模块可以执行哪些Task(不包括父子模块)。

gradle tasks
  • --all:该参数可以查看所有任务(包括父子模块)

调用Task

调用Task比较简单,也是最常用的命令,比如我们很常用的构建工程gradle build,编译Java代码gradle classes等,其通用格式如下。

gradle <task1名> <task2名> ...

参数可以接任意个Task按顺序执行。

自定义Task

我们可以直接在build.gradle中定义我们自己的Task。自定义Task例子如下。

task A {
    // 配置阶段
    println 'task A configure'
    doFirst {
        // 执行阶段
        println 'task A do first'
    }
    doLast {
        // 执行阶段
        println 'task A do last'
    }
}

其中代码分为3部分,最外层的被称为配置阶段,配置阶段在所有Task真正执行前执行;而执行阶段又分为doFirstdoLast,前者会先执行。

Task依赖

Task依赖表示一个任务要想执行,必须依赖另一个任务先执行的结果,比如打包一定要在编译后执行。定义任务依赖写法如下。

task A {
    doFirst {
        println 'task A'
    }
}

task B(dependsOn: [A]) {
    doFirst {
        println 'task B'
    }
}

注意:依赖树中重复的依赖只会执行1次。

Task分组和描述

Task有分组属性,之前我们执行gradle tasks就可以观察到分组显示的Task,如果自定义Task没有指定该属性,默认属于other分组,除了分组,我们还可以给Task指定描述。下面是一个例子。

task A {
    group 'my group'
    description 'This is my demo task'
    doFirst {
        println 'task A'
    }
}

Plugin 插件

Gradle本身只提供了一个框架,具体构建Java工程或是其它类型的工程,以及自动化的打包、发布等,都是通过插件的形式实现的。比如构建Java工程需要java插件,JavaWeb工程额外还需要war插件。Gradle相比Maven的一大优势就是灵活性,我们也很容易编写自己的插件。

Gradle插件可以分为核心插件和第三方插件,我们可以在官方文档中找到所有的核心插件列表。我们Java开发中常用的大部分功能核心插件都已经包含了,比如很常用的javawarapplication插件等,build.gradle中引入核心插件。

plugins {
    id 'java'
    id 'war'
}

除了核心插件,Gradle还维护了第三方插件的插件仓库:https://plugins.gradle.org/

build.gradle中引入第三方插件。

plugins {
    id 'com.jfrog.bintray' version '1.8.5'
}

对于具体某一个插件有哪些配置、哪些Task,这里就不过多描述了,具体可以参考相关文档。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。