原文发于微信公众号 jzman-blog,欢迎关注交流。

前面两篇文章分别介绍了 Gradle 基础知识以及 Groovy 相关基础知识,这也是学习 Gradle 所必需了解的,文章链接如下::

本文将对 Gradle 整体进行了介绍和学习,了解了 Task、Project 等相关概念以及对使用 Gradle 来构建项目的一些常用操作,主要内容如下:

  1. Setting 文件
  2. Build 文件
  3. Project 和 Tasks
  4. 任务的创建
  5. 任务依赖
  6. 任务间的交互
  7. 自定义属性
  8. 总结

Setting 文件

说一下 Gradle 构建项目的 Setting 文件,该文件主要用来配置当前工程,比如 Android 开发中一个项目中可能有多个子 Module,当不需要某个子 Module 时,可以取消该 Module 在配置文件 Setting 中的配置即可,当然只有在 Setting 文件中配置的子 Module 才会被构建,当然不只是 Android 开发,只要使用 Gradle 构建的项目都一样,Setting 是 Gradle 构建项目默认的配置文件名,下面简单测试一下 Setting.gradle 文件的使用,测试工程目录如下:

├─GradleSetting
│ ├─.gradle
│ │ ├─4.1
│ │ │ ├─fileChanges
│ │ │ ├─fileHashes
│ │ │ └─taskHistory
│ │ └─buildOutputCleanup
│ └─test
│ └─Method
│ └─.gradle
│ ├─4.1
│ │ ├─fileChanges
│ │ ├─fileHashes
│ │ └─taskHistory
│ └─buildOutputCleanup
│ build.gradle
│ setting.gradle

在工程名为 GradleSetting 的工程中 test 文件夹下有一个 Method 的子项目,这里会通过配置 setting.gradle 文件将子项目 Method 构建到 GradleSetting 中,setting.gradle 文件内容如下:

println "---------test----Setting.gradle----------"
//输出当前工程目录
println(rootDir)
//指定要参与构建的子项目
include ':Method'
project(':Method').projectDir = new File(rootDir,'test/Method')

来看一下输出结果:

PS E:\Gradle\study\GradleSetting> gradle testGradleSetting
---------test----Setting.gradle----------
E:\Gradle\study\GradleSetting > Configure project :
testGradleSetting > Configure project :Method
3
3
30
获取方法返回的结果:30
1
2
3
4
5 BUILD SUCCESSFUL in 2s

因为在 setting.gradle 文件中配置了 Method,从输出结果看 Method 确实参与了构建,取消在 setting.gradle 文件中的配置,则不会构建 Method,最好自己验证一下。

上面配置了子项目 Method 所在的位置,如果不指定则默认是与 setting.gradle 同级的目录。

Build 文件

如果选择使用 Gradle 构建项目,则每个项目都有一个 build.gradle 文件,该文件是项目构建的入口,对整个项目的配置生效,可以在根项目配置子项目的一下通用配置,比如配置子项目的仓库为 jcenter,这样子项目中所有的依赖就指向 jcenter 中心库下载,下面是参考代码:

//配置子项目依赖的仓库
subprojects{
repositories{
jcenter()
}
} //配置全部项目
allprojects{ } ...

通过本小节主要了解 build.gradle 文件的作用即可,实际开发中针对不同类型的项目会有更详细的相应配置策略。

Project 和 Tasks

在 Gradle 中有很多 Project,可将某个 Project 打包成 jar 提供给另一个 Project 使用,每个 Project 都是根据其业务需求抽象出来的一个子模块,最终通过 Gradle 构建成完整的项目。

每个 Project 允许有多个 task,Task 理解为任务,task 主要 完成某个具体的功能点,比如 wrapper task 主要就是完成 wrapper 文件的创建。

任务的创建

对于任务的创建已经比较熟悉了,下面使用 task 声明一个任务:

//1. 创建一个任务
task createTask{
doFirst{
println 'doFirst'
} doLast{
println 'doLast'
}
} //2. 使用TaskContainer创建一个任务,Project已经定义的TaskContainer,即tasks
tasks.create("createTask1"){
doFirst{
println 'doFirst'
} doLast{
println 'doLast'
}
}

task 可以理解为创建任务的关键字,实际上 task 是 Project 里面的一个方法,在 Groovy 中可以省略方法参数上的括号,花括号里的内容是一个闭包,主要是对 task 进行相关配置,doFirst 和 doLast 是 Task 中常用的两个方法,分别会在该 task 开始和结束时执行。

任务依赖

任务之间可以相互依赖,可以控制某个任务执行的先后顺序,比如在运行 A 之前必须先运行 B,此时任务 A 依赖任务 B,具体参考如下代码:

//单任务依赖:通过dependsOn指定要依赖的任务
task B(dependsOn: A){
doFirst{
println 'B'
}
} task C{
doFirst{
println 'C'
}
} //多任务依赖
task D{
dependsOn A, C
doFirst{
println 'D'
}
}

下面看一下执行多依赖任务 gradle D 的执行结果:

PS E:\Gradle\study\GradleSetting> gradle D

> Task :A
A > Task :C
C > Task :D
D BUILD SUCCESSFUL in 2s

显然,执行任务 D,其依赖的其他两个任务先执行,控制了任务执行的先后顺序。

注意:脚本是按照顺序执行,如果任务任务 A 和 C 在任务 D 的后面定义,当执行任务 D 的时候肯定会出错。

任务间的交互

创建的任务都有自己的名称,其类型是 Task,那么我们就可以通过 Task API 来控制控制任务的执行,使用任务名操作任务的原理是:Project 在创建任务的时候,已经将该任务对应的任务声明为 Project 对象的一个类型为 Task 的一个属性,测试代码如下:

//任务之间的交互
task E{
println 'hello e'
println "E是不是Project的属性:"+project.hasProperty('E')
} E.doFirst{
println 'doFirst'
} E.doLast{
println 'doLast'
}

上述代码的执行结果如下:

PS E:\Gradle\study\GradleSetting> gradle E

> Configure project :
hello e
E是不是Project的属性:true > Task :E
doFirst
doLast BUILD SUCCESSFUL in 1s

自定义属性

Project 和 Task 都允许用户添加额外的自定义属性,通过应用所属对应的 ext 属性来实现,添加之后可以通过 ext 属性对自定义的属性进行读取和设置,如果要同时添加多个自定义属性,可以通过 ext 代码块,参考如下代码定义自定义属性:

apply plugin:"java"

//自定义单个属性
ext.name1 = "Gradle"
//自定义多个属性
ext{
age = 10
score = 100
} //在SourceSet中使用自定义属性
sourceSets.all{
ext.resourceDir = null
} //配置自定义属性
sourceSets{
main{
resourceDir = "main/res"
}
test{
resourceDir = "test/res"
}
} task customProperty{
println "name=${name1}"
println "age=${age}"
println "score=${score}" sourceSets.each {
println "${it.name} resourceDir is ${it.resourceDir}"
}
}

上述代码的执行结果:

PS E:\Gradle\study\GradleSetting> gradle customProperty

> Configure project :

name=Gradle
age=10
score=100
main resourceDir is main/res
test resourceDir is test/res BUILD SUCCESSFUL in 2s

自定义属性相较局部变量作用域更加广泛,可以跨 Task、Project 访问自定义属性,只要能访问这些属性所属的对象,那么这些属性就可以被访问到, Android 开发中可以使用自定义属性单独定义版本号、版本名称以及用到的第三方库的版本,将其同意在单独的 gradle 文件中,各 Module 直接获取即可,不仅方便管理依赖库的版本,还在一定程度上提高工作效率。

总结

Gradle 脚本基于 Grooy ,而 Groovy 完全兼容 Java 语法,Gradle 脚本本质上还是代码,在 Gradle 中可以利用相关语法来完成相关功能。可以关注公众号:躬行之(jzman-blog),一起交流学习。

Gradle系列之构建脚本基础的更多相关文章

  1. 【Gradle】Gradle构建脚本基础

    Gradle构建脚本基础 Settings文件 在Gradle中,定义了一个设置文件,用于初始化以及工程树的配置.设置文件的默认名为settings.gradle,放在根工程目录下. 设置文件大多数的 ...

  2. Gradle构建脚本基础

    Gradle构建脚本,内部是基于 Groovy 的 DSL(领域特点语言),而Maven是基于XML的,Groovy相比XML更加简洁.灵活和强大. Groovy 因为给 Java 开发人员提供了最大 ...

  3. 【转载】Gradle学习 第六章:构建脚本基础

    转载地址:http://ask.android-studio.org/?/article/11 6.1. Projects and tasks 项目和任务Everything in Gradle si ...

  4. 《Gradle权威指南》--Gradle构建脚本基础

    No1: 设置文件默认名是setting.gradle,放在根目录下,大多数作用都是为了配置子工程 No2: 一个Project包含很多个Task.Task就是一个操作,一个原子性的操作.其实它是Pr ...

  5. shell 构建脚本基础

    bash -v test.sh 启用 verbose 调试模式 bash -n test.sh  启用语法检查调试模式 bash -x test.sh  遍历脚本执行过程 一.基础参数 1.shell ...

  6. Gradle系列之Android Gradle基础配置

    原文发于微信公众号 jzman-blog,欢迎关注交流. 通过前面几篇文章学习了 Gradle 基础知识以及 Gradle 插件相关的知识,关于 Gradle 及其插件相关知识请先阅读下面几篇文章: ...

  7. Gradle系列之认识Gradle任务

    原文发于微信公众号 jzman-blog,欢迎关注交流. 前面几篇学习了 Gradle 构建任务的基础知识,了解了 Project 和 Task 这两个概念,建议先阅读前面几篇文章: Gradle系列 ...

  8. Gradle系列之Android Gradle插件

    原文发于微信公众号 jzman-blog,欢迎关注交流. 通过前面几篇文章学习了 Gradle 基础知识以及 Gradle 插件相关的知识,关于 Gradle 及其插件相关知识请先阅读下面几篇文章: ...

  9. Gradle系列之Android Gradle高级配置

    本篇文章主要在之前学习的基础上,从实际开发的角度学习如何对 Android Gradle 来进行自定义以满足不同的开发需求,下面是 Gradle 系列的几篇文章: Gradle系列之初识Gradle ...

随机推荐

  1. XAI/MLI 可解释机器学习系列1- 开源&paper汇总

    一直在关注可解释机器学习领域,因为确实在工作中有许多应用 模型检查,特征重要性是否符合预期和AUC一样重要 模型解释,比起虚无缥缈的模型指标,解释模型学到的规律更能说服业务方 样本解释,为什么这些用户 ...

  2. STL sort的comp函数注意事项

    今天写了个题,结果碰巧re了,我眉头一皱发现事情并不简单. 原来我之前的comp写的都是错的. bool cmp(milkman a,milkman b) { return a.price<=b ...

  3. ViewDragHelper类的基本使用

    在android的开发包android.support.v4.widget中有一个ViewDragHelper类.这个类的作用是帮助我们处理View的拖拽滑动.在一个ViewGroup类的内部定义一个 ...

  4. 数据库整理(三) SQL基础

    数据库整理(三) SQL基础 SQL语言的特点 集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于一体. 可以独立完成数据库生命周期中的全部活动: ​ ●定义和修改.删除关 ...

  5. gdb基本命令总结

    本文介绍使用gdb调试程序的常用命令.  主要内容: [简介] [举例] [其他] [简介]  ============= GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.如果你是在 ...

  6. JDBC——使用JDBC连接MySQL数据库

    在JDBC--什么是JDBC一文中我们已经介绍了JDBC的基本原理. 这篇文章我们聊聊如何使用JDBC连接MySQL数据库. 一.基本操作 首先我们需要一个数据库和一张表: CREATE DATABA ...

  7. Appium查看应用包名

    方式一没有apk 如果应用已经安装在手机上了(例如应用商城下载).可以直接打开手机上该应用, 进入到要操作的界面然后执行: adb shell dumpsys activity recents | f ...

  8. WeChair项目Alpha冲刺(3/10)

    团队项目进行情况 1.昨日进展    Alpha冲刺第三天 昨日进展: 前端初步完成小程序预约页的html+css设计 后端springboot项目测试运行HelloWorld通过,以及LoginCo ...

  9. Linux 集群安装zookeeper

    系统:CentOs 7 环境:jdk 8 Zookeeper 下载地址:  http://www-eu.apache.org/dist/zookeeper/stable/ 上传至服务器并解压,本人放在 ...

  10. 小白—职场之Java基础篇

    java基础篇 java基础 目录 1.java是一种什么语言,jdk,jre,jvm三者的区别 2.java 1.5之后的三大版本 3.java跨平台及其原理 4.java 语言的特点 5.什么是字 ...