Gradle学习之六Task详解

系列文章目

Gradle学习之一入门介绍
Gradle学习之二Groovy核心语法
Gradle学习之三Groovy高级语法
Gradle学习之四Gradle生命周期
Gradle学习之五Project详解
Gradle学习之六Task详解
Gradle学习之七其他重要模块


概述

  • 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的类型

在这里插入图片描述
具体使用参考官网文档

猜你喜欢

转载自blog.csdn.net/dirksmaller/article/details/109112735