Skip to main content

Gradle 使用指南

基础概念

Gradle 是一个开源的自动化构建工具,专注于灵活性和性能。Gradle 构建脚本是使用 Groovy 或 Kotlin DSL 编写的。

Gradle的执行流程

生命周期作用
Initialzation初始化阶段解析整个工程中所有project(读取setting.gradle文件),构建所有的project对应的Project对象
Configuration配置阶段解析所有的project对象中的task,构建好所有task的拓扑图
Execution执行阶段执行具体的task及其依赖的task

Gradle中的Project

每一个 build.gradle 脚本文件被 Gradle 加载解析后,都会对应生成一个 Project 对象,在脚本中的配置方法其实都对应着 Project 中的API,如果想详细了解这些脚本的配置含义,有必要对Project的属性进行学习。

importing-data-sample

  • project相关api:让当前project拥有操作父project以及管理子project的能力
  • task相关api:为当前project提供新增task以及使用当前project已有task的能力
  • 属性相关api:让我们拥有为project添加额外属性的能力
  • file相关api:操作当前project下文件的处理
  • 生命周期api:和gradle生命周期相关的api
  • 其他api:除上述api以外比较零散的api

Gradle中的Task

Task 定义了一个当前任务执行时的最小单元,一个 Project 中一般会存在很多个 Task,通过执行这些 Task 来完成整个项目的构建。也就是说,项目构建的实际工作是由一个个的 Task 来完成的。

  1. 可以依赖于别的 Task 有时候我们期望该 Task 在某个 Task 执行之后再执行,此时可以使用 dependsOn 方法来设置依赖关系,让 Task 按照顺序执行。
  2. 不同时机的 Task 动作:onConfig(配置块)、doFirst、doLast、action Task 具备自己的执行周期,我们可以选择在不同的时机做不同的事情。 onConfig(配置块) 表示项目的配置阶段,也就是上述生命周期中的配置阶段,Task 中的配置代码块将会被执行。 doFirst 以及 doLast 是指在 Task 的动作(action)执行前或执行后定义的动作。 action 指执行阶段被运行的代码块。
  3. 输入/输出 Gradle 通过比较 两个构建 task 的 inputs 和 outputs 来决定是否是最新的。如果 inputs 和 outputs 没有发生变化,则认为 task 是最新的,因此,只有当 inputs 和 outputs 不同时,task 才会运行,否则将会跳过。
  4. 一些 getter/setter 属性 除此之外,Task 中提供了很多属性,我们可以通过 get/set 方法来获取或者设置。、

Task 的 inputs 和 outputs

inputs 与 outputs 的也是 Task 的一个很重要的特性,Gradle 通过判断 Task的 inputs/outputs 的一致性来判断 Task 是否是最新的,如果 Task 是最新的,那么构建阶段将会跳过这个 Task 来节省构建时间。

inputs 和 outputs 可以是一个目录、一个或多个文件,或者是任意一个属性。

kotlin配置gradle优点

  • 无需额外学习Groovy
  • 编辑Gradle文件时IDE支持Kotlin智能补全,Groovy则不支持
  • Kotlin提供顶级变量吗,可以通过Dep等全局静态变量传递配置,Groovy则要借助Java的成员变量Project#ext传递配置
  • 错误信息易的读性比Groovy要好得多

工程构建

importing-data-sample

root project 配置

allprojects {
// 统一引入 java 插件、指定JDK版本指定
apply plugin :"java"
sourceCompatibility = 1.8

// 统一 group 和 version
group 'org.milory'
version '1.0-SNAPSHOT'

// 仓库的配置
repositories {
mavenLocal()
maven{
url 'https://maven.aliyun.com/repository/public/'
}
mavenCentral()
}

// 将公共的依赖抽取出来
dependencies {
compile 'ch.qos.logback:logback-classic:1.2.3'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
}

子模块配置

dependencies {
compile project(":model")
}

多工程构建特点

  1. rootProject 配置公共的依赖和属性
  2. 其它子模块只需要配置其独自特殊的配置即可
  3. 构建单独子模块只需要构建本身和其依赖的模块即可
  4. 构建 rootProject 项目会构建所有模块项目

工程发布

importing-data-sample


gradle 的发布task任务

  1. generateMetadataFileForPublishProjectPublication ==> 生成metaData 文件
  2. generatePomFileForPublishProjectPublication ==> 生成pom 文件
  3. publish ==> 发布到 repositories 中指定的仓库(一般为 Maven 私服)
  4. publishAllPublicationsToMavenRepository ==> 发布所有到Maven仓库
  5. publishToMavenLocal ==> 执行所有发布任务中的操作发布到本地 maven 仓库

发布配置

publishing {
publications {
// publishProject 为自定义名称,可写多个发布任务
publishProject(MavenPublication){
from components.java // 发布 jar 包
//from components.war // 发布 war 包
}
}
// 配置发布到哪里
repositories {
maven {
//指定要上传的 maven 私服仓库
url = ""
//认证用户和密码
credentials {
username 'root'
password 'admin'
}
}
}
}