文章目录
- 系列文章目
- 概述
- 一、Task定义及配置
- 二、Task的执行详解
- 三、Task的执行顺序
- 3.1 task依赖设置
- 3.2 task依赖案例应用
- 3.3 Task的输入输出
- 3.4 挂接到构建流程
- 四、Task的类型
概述
- Task定义及配置
- Task的执行详解
- Task的依赖和执行顺序
- Task类型
- 挂接到构建生命周期
- Task实战
一、Task定义及配置
./gradlew tasks 命令可以查看当前项目中task的数目和Task的信息。
定义Task有两种方式:1.使用Project的task的方法 2.使用Task容器创建
//直接通过task函数去创建
task helloTask {
println 'I am HelloTask'
}
//使用TaskContainer创建
this.tasks.create(name: 'helloTaks2'){
println 'I am helloTaks2'
}
运行Task:
./gradlew helloTask
./gradlew helloTask2
同样配置Task属性的时间点也是如此:
//配置task
//1. 在定义的时候配置
task helloTaks(group:'zfc',description:'task study'){
println 'I am HelloTask'
}
//使用TaskContainer创建
this.tasks.create(name: 'helloTaks2'){
//分组
setGroup('zzz')
//注释
setDescription("tasks study")
println 'I am helloTaks2'
}
下面是Task声明的属性:
public interface Task extends Comparable<Task>, ExtensionAware {
String TASK_NAME = "name";
String TASK_DESCRIPTION = "description";
String TASK_GROUP = "group";
String TASK_TYPE = "type";
String TASK_DEPENDS_ON = "dependsOn";
String TASK_OVERWRITE = "overwrite";
String TASK_ACTION = "action";
}
二、Task的执行详解
只有Task可以在Gradle的执行阶段
//配置task
//1. 在定义的时候配置
task helloTaks(group:'zfc',description:'task study'){
println 'I am HelloTask'
doFirst {
println 'the task group is :' + group
}
doFirst {}
}
//需要注意的是 外部的doFirst要优先于内部的doFirst执行
helloTaks.doFirst {
println 'the task group is :' + description
}
//使用TaskContainer创建
this.tasks.create(name: 'helloTaks2'){
//分组
setGroup('zzz')
//注释
setDescription("tasks study")
println 'I am helloTaks2'
}
案例:计算App的Build的时长
/打印build的时间
def startBuildTime,endBuildTime
this.afterEvaluate {
def preBuildTask = this.tasks.getByName("preBuild")
//在该task执行之前,获取时间
preBuildTask.doFirst {
startBuildTime = System.currentTimeMillis()
println "the build start time is $startBuildTime"
}
def buildTask = this.tasks.getByName("build")
//在该task执行之前,获取时间
buildTask.doLast {
endBuildTime = System.currentTimeMillis()
println "the build time is ${endBuildTime - startBuildTime}"
}
}
三、Task的执行顺序
3.1 task依赖设置
task taskX{
doLast {
print 'taskX'
}
}
task taskY{
doLast {
print 'taskY'
}
}
//在创建Task的时候,设置其依赖的task
task taskZ(dependsOn:[taskX]){
doLast {
print 'taskZ'
}
}
//通过调用对象方法创建依赖关系
taskZ.dependsOn('taskY')
我们在创建task的时候,还可以在闭包里面设置dependsOn属性来增加task依赖
task noLib {
doLast {
println 'noLib'
}
}
task lib2 {
doLast {
println 'lib2'
}
}
task taskZ(dependsOn:[taskX]){
//该task依赖所有的lib开头的task,但是
//需要注意的是 这里只有lib1生效了,因此lib2声明在后面
dependsOn this.tasks.findAll { task->
return task.name.startsWith("lib")
}
doLast {
print 'taskZ'
}
}
task lib2 {
doLast {
println 'lib2'
}
}
3.2 task依赖案例应用
案例:实现在App模块下,将子目录下的xml文件读取,并进行记录拆分,并存储为单个文件。然后再定义一个task验证拆分结果。
**准备工作:**在app模块下存在test.xml文件,其内容如下:
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
实现逻辑:
task writeBookstore2File{
println '---------------------'
def srcFile = file('bookstore.xml')
//解析xml对象
def bookstore = new XmlParser().parse(srcFile)
if(bookstore == null){
println 'the xml parse failed!'
return
}
//以书名和作者命名文件
bookstore.book.each{ book->
//闭包
//注意 文件路径只有在当前闭包内有效
def destDir = new File(this.buildDir.absolutePath+"/generated/bookstore")
if(!destDir.exists()){
destDir.mkdirs()
}
def destPath = new File(destDir,book.@category)
if(!destPath.exists()){
destPath.createNewFile()
}
println destPath.absolutePath
def content = "${book.title.text()} ${book.author.text()} ${book.@category} "
destPath.withWriter { writer ->
writer.write(content)
}
}
println '---------------------'
}
task writeBookstoreTest{
dependsOn 'writeBookstore2File'
doLast {
//注意 文件路径只有在当前闭包内有效
def destDir = new File(this.buildDir.absolutePath+"/generated/bookstore")
//将文件夹中的文件名打印出来
fileTree(destDir){ dir ->
dir.each { file ->
println file.name
}
}
}
}
3.3 Task的输入输出
TaskInputs TaskOutputs 是gradle的输入和输出类。
//定义扩展属性
//定义扩展属性
ext{
versionName = '1.0.2'
versionCode = '1011'
versionInfo = 'App 第一个版本111'
destFile = file('releases.xml')
if(destFile!=null && !destFile.exists()){
destFile.createNewFile()
}
}
task writeTask{
inputs.property('versionName',project.ext.versionName)
inputs.property('versionCode',project.ext.versionCode)
inputs.property('versionInfo',project.ext.versionInfo)
//inputs.properties(map)
outputs.file this.destFile
doLast{
//获取要写入的数据
def data = inputs.getProperties()
File file = outputs.getFiles().getSingleFile()
//将data转化为bean对象
def versionMsg = new VersionMsg(data)
//写入xml
def sw = new StringWriter()
def xmlBuilder = new MarkupBuilder(sw)
//如果有内容
if(file.text !=null && file.text.size()<=0){
println '-------------------'
xmlBuilder.releases{
release{
versionCode(versionMsg.versionCode)
versionName(versionMsg.versionName)
versionInfo(versionMsg.versionInfo)
}
}
file.withWriter{ writer->
writer.append(sw.toString())
}
}else{
println '**************'
//将xml数据写入到根节点之下
xmlBuilder.release{
versionCode(versionMsg.versionCode)
versionName(versionMsg.versionName)
versionInfo(versionMsg.versionInfo)
}
//获取当前的内容行
def lines = file.readLines()
def lengths = lines.size()-1
file.withWriter{ writer->
lines.eachWithIndex{ String line, int index ->
if(index != lengths){
writer.append(line + '\r\n')
}else if(index == lengths){
writer.append('\r\n' + sw.toString() + '\r\n')
writer.append(lines.get(lengths))
}
}
}
}
}
}
class VersionMsg{
String versionCode
String versionName
String versionInfo
}
task readTask{
inputs.file this.destFile
doLast{
def file = inputs.getFiles().getSingleFile()
println file.text
}
}
task writeReadTaskTest{
dependsOn readTask,writeTask
doLast{
println '测试结束 。。。。'
}
}
3.4 挂接到构建流程
task taskX{
doLast {
print 'taskX'
}
}
task taskY{
mustRunAfter 'taskX'
doLast {
print 'taskY'
}
}
task taskZ(){
mustRunAfter 'taskY'
//shoudRunAfter
doLast {
print 'taskZ'
}
}
this.project.afterEvaluate{ project - >{
def buildTask = project.tasks.getByName('build')
if(buildTask == null){
throw GradleException('the build task is not found')
}
buildTask.doLast{
writeTask.execute()
}
}
在gradle中引入gradle:
apply from: '文件对象(单个文件用file获取,文件夹用fileTree)'
四、Task的类型