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的属性进行学习。
- 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 来完成的。
- 可以依赖于别的 Task 有时候我们期望该 Task 在某个 Task 执行之后再执行,此时可以使用 dependsOn 方法来设置依赖关系,让 Task 按照顺序执行。
- 不同时机的 Task 动作:onConfig(配置块)、doFirst、doLast、action Task 具备自己的执行周期,我们可以选择在不同的时机做不同的事情。 onConfig(配置块) 表示项目的配置阶段,也就是上述生命周期中的配置阶段,Task 中的配置代码块将会被执行。 doFirst 以及 doLast 是指在 Task 的动作(action)执行前或执行后定义的动作。 action 指执行阶段被运行的代码块。
- 输入/输出 Gradle 通过比较 两个构建 task 的 inputs 和 outputs 来决定是否是最新的。如果 inputs 和 outputs 没有发生变化,则认为 task 是最新的,因此,只有当 inputs 和 outputs 不同时,task 才会运行,否则将会跳过。
- 一些 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要好得多
工程构建
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")
}
多工程构建特点
- rootProject 配置公共的依赖和属性
- 其它子模块只需要配置其独自特殊的配置即可
- 构建单独子模块只需要构建本身和其依赖的模块即可
- 构建 rootProject 项目会构建所有模块项目
工程发布
gradle 的发布task任务
- generateMetadataFileForPublishProjectPublication ==> 生成metaData 文件
- generatePomFileForPublishProjectPublication ==> 生成pom 文件
- publish ==> 发布到 repositories 中指定的仓库(一般为 Maven 私服)
- publishAllPublicationsToMavenRepository ==> 发布所有到Maven仓库
- publishToMavenLocal ==> 执行所有发布任务中的操作发布到本地 maven 仓库
发布配置
publishing {
publications {
// publishProject 为自定义名称,可写多个发布任务
publishProject(MavenPublication){
from components.java // 发布 jar 包
//from components.war // 发布 war 包
}
}
// 配置发布到哪里
repositories {
maven {
//指定要上传的 maven 私服仓库
url = ""
//认证用户和密码
credentials {
username 'root'
password 'admin'
}
}
}
}