Gradle核心之Task详解

news/2024/5/20 2:34:02 标签: gradle, task, android

文章目录

  • Task定义和配置
    • 定义
    • 配置
    • Task源码
  • Task执行详解
    • doFirst
    • 计算build执行时长
  • Task执行顺序
  • Task依赖
    • 动态依赖Task
    • 解析xml并输出到文件
  • Task输入输出
    • 输入输出示例
  • 挂接自定义Task到构建过程中
    • 挂接过程详解
  • Task类型

查看task

./gradlew tasks

在这里插入图片描述

Task定义和配置

定义

//直接通过task函数去创建
task helloTask{
    println 'i am helloTask'
}

或者写成

task(helloTask,{
    println 'i am helloTask'
})
 ./gradlew helloTask
//通过TaskContainer去创建Task
this.tasks.create(name:'helloTask'){
    println 'i am helloTask'
}

配置

两种基本配置的方法

写法1:

task helloTask(group:'hongx',description:'task work'){
    println 'i am helloTask'
}

写法2:

this.tasks.create(name:'helloTask'){
    setGroup('hongx')
    setDescription('task work')
    println 'i am helloTask'
}

在Gradle中可以看到新创建的分组
在这里插入图片描述

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执行详解

doFirst

代码在执行阶段才执行

task helloTask(group:'hongx',description:'task work'){
    println 'i am helloTask'
    doFirst{
        println 'the task group is:' + group
    }
    doFirst{}
}

helloTask.doFirst{
    println 'the task description is:' + description
}
 ./gradlew helloTask

查看结果

> Configure project :app
the file name is :debug
the file name is :output.json
the file name is :app-debug.apk
i am helloTask

> Task :app:helloTask
the task description is:task work
the task group is:hongx

先输出外部的doFirst,然后再执行闭包中的doFirst

计算build执行时长

def startBuildTime,endBuildTime
this.afterEvaluate {Project project ->
    //保证要找的task已经配置完毕
    def preBuildTask = project.tasks.getByName('preBuild')
    preBuildTask.doFirst{
        startBuildTime = System.currentTimeMillis()
        println 'the start time is:' + startBuildTime
    }

    def buildTask = project.tasks.getByName('build')
    buildTask.doLast{
        endBuildTime = System.currentTimeMillis()
        println 'the end time is:' + endBuildTime
        println "the build time is:  ${endBuildTime - startBuildTime}"
    }
}
./gradlew build

在这里插入图片描述

Task执行顺序

在这里插入图片描述

Task依赖


task taskX {
    doLast{
        println 'taskX'
    }
}
task taskY {
    doLast{
        println 'taskY'
    }
}
task taskZ(dependsOn: [taskX,taskY]) {
    doLast{
        println 'taskZ'
    }
}
./gradlew taskZ

在这里插入图片描述

taskZ也可以写成如下

task taskZ {
    doLast{
        println 'taskZ'
    }
}
taskZ.dependsOn(taskX,taskY)

动态依赖Task

task lib1 {
    doLast {
        println 'lib1'
    }
}
task lib2 {
    doLast {
        println 'lib2'
    }
}
task noLib {
    doLast {
        println 'noLib'
    }
}
task taskZ {
    dependsOn this.tasks.findAll {
        task -> return task.name.startsWith("lib")
    }
    doLast {
        println 'taskZ'
    }
}

在这里插入图片描述


解析xml并输出到文件

在app目录下新建releases.xml文件

<?xml version="1.0" encoding="utf-8"?>
<releases>
    <release>
        <versionCode>100</versionCode>
        <versionName>1.0.0</versionName>
        <versionInfo>App第1版本</versionInfo>
    </release>
    <release>
        <versionCode>101</versionCode>
        <versionName>1.0.1</versionName>
        <versionInfo>App第2版本</versionInfo>
    </release>
    <release>
        <versionCode>110</versionCode>
        <versionName>1.1.0</versionName>
        <versionInfo>App第3版本</versionInfo>
    </release>
</releases>
task handleReleaseFile {
    def srcFile = file('releases.xml')
    def destDir = new File(this.buildDir , 'generated/release/')
    doLast {
        println '开始解析对应的xml文件'
        destDir.mkdir()
        def releases = new XmlParser().parse(srcFile)
        releases.release.each { releaseNode ->
            //解析每个release结点的内容
            def versionName = releaseNode.versionName.text()
            def versionCode = releaseNode.versionCode.text()
            def versionInfo = releaseNode.versionInfo.text()
            //创建文件并写入结点数据
            def destFile = new File(destDir, "release-${versionName}.text")
            destFile.withWriter { writer ->
                writer.write("${versionName} --> ${versionCode} --> ${versionInfo}")
            }
        }
    }

}

task handleReleaseFileTest(dependsOn: handleReleaseFile) {
    def dir = fileTree(this.buildDir.path + 'generated/release/')
    doLast {
        dir.each {
            println 'the file name is :' + it
        }
        println '输出完成!'
    }
}

执行 ./gradlew handleReleaseFileTest

在这里插入图片描述

Task输入输出

在这里插入图片描述

输入输出示例

ext {
    versionName = '1.0.0'
    versionCode = '100'
    versionInfo = 'App的第1个版本'
    destFile = file('releases.xml')
    if (destFile != null && !destFile.exists()) {
        destFile.createNewFile()
    }
}

task writeTask {
    //为task指定输入
    inputs.property('versionCode', this.versionCode)
    inputs.property('versionName', this.versionName)
    inputs.property('versionInfo', this.versionInfo)
    //为task指定输出
    outputs.file destFile
    doLast {
        def data = inputs.getProperties()
        File file = outputs.getFiles().getSingleFile()
        //将map转化为实体对象
        def versionMsg = new VersionMsg(data)
        //将实体对象转化为xml格式数据
        def sw = new StringWriter()
        def xmlBuilder = new MarkupBuilder(sw)
        if (file.text != null && file.text.size() <= 0) {
            //文件中没有内容
            xmlBuilder.release {
                release {
                    versionCode(versionMsg.versionCode)
                    versionName(versionMsg.versionName)
                    versionInfo(versionMsg.versionInfo)
                }
            }
            file.withWriter { writer -> writer.append(sw.toString()) }
        } else {
            //已有版本信息
            xmlBuilder.release {
                release {
                    versionCode(versionMsg.versionCode)
                    versionName(versionMsg.versionName)
                    versionInfo(versionMsg.versionInfo)
                }
            }
            //将生成的xml数据插入到根结点之前
            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\r\n' + sw.toString() + '\r\n')
                        writer.append(lines.get(lengths))
                    }
                }
            }
        }
    }
}

class VersionMsg {
    String versionCode
    String versionName
    String versionInfo
}

task readTask {
    inputs.file destFile
    doLast {
        def file = inputs.files.singleFile
        println file.text
    }
}

task taskTest {
    dependsOn readTask, writeTask
    doLast {
        println '输入输出任务结束'
    }
}
./gradlew taskTest

挂接自定义Task到构建过程中

task taskX {
    doLast {
        println 'taskX'
    }
}
task taskY {
    mustRunAfter taskX
    doLast {
        println 'taskY'
    }
}
task taskZ {
    mustRunAfter taskY
    doLast {
        println 'taskZ'
    }
}

打乱顺序执行:

 ./gradlew taskZ taskY taskX

在这里插入图片描述


挂接过程详解

https://blog.csdn.net/hongxue8888/article/details/103125597


Task类型

https://docs.gradle.org/current/dsl/index.html

在这里插入图片描述


http://www.niftyadmin.cn/n/1838291.html

相关文章

ORB特征原理

假如有2张图片&#xff0c;我们需要确认这2张图片中是否是同一个人&#xff1b;相对于人眼视觉系统来说这太简单了&#xff0c;只需轻轻扫过2张图片就可以得出结论。但是&#xff0c;如果想让计算机来完成这个功能就困难重重了&#xff0c;再清楚分图像在计算机眼中也只是0-1组…

Gradle中的Settings和SourceSet

文章目录SettingsSourceSetSettings Settings 的核心作用就是决定我们项目的哪些工程是要被gradle处理的。 Settings.java部分源码&#xff1a; HasInternalProtocol public interface Settings extends PluginAware, ExtensionAware {/*** <p>The default name for t…

腾讯技术开放日 | 腾讯会议如何构建实时视频传输算法架构,来实现用户体验质量最优?

在实时视频通讯中&#xff0c;要达到终端用户的体验质量&#xff08;QoE&#xff09;最优&#xff0c;需要实现实时视频传输的信号质量和交互性最优&#xff0c;而时延和带宽是有限的&#xff0c;如何衡量取舍对有限资源进行分配&#xff0c;成为构建腾讯会议实时视频传输算法架…

腾讯宣布五年5000亿投入计划,发力新基建

5月26日&#xff0c;腾讯云与智慧产业事业群总裁汤道生对外宣布&#xff0c;腾讯未来五年将投入5000亿&#xff0c;用于新基建的进一步布局。 据介绍&#xff0c; 云计算、人工智能、区块链、服务器、大型数据中心、超算中心、物联网操作系统、5G网络、音视频通讯、网络安全、量…

asp.net表格的弹出页imagebutton按钮修改数据后的表格刷新

在模板页的imagebutton控件添加单击事件&#xff1a; 因为单击事件滞后与ONClienClick事件&#xff0c;所以重新提取数据源&#xff0c;单不改变表格的当前页索引。 注&#xff1a;1、imagebutton单击事件重新提取表格数据源 2、ONClienClick指向一个修改表格当前行数据的u…

图像处理和卷积神经网络架构

https://mp.weixin.qq.com/s?__bizMzA3MzI4MjgzMw&mid2650728746&idx1&sn61e9cb824501ec7c505eb464e8317915&scene0#wechat_redirect 感谢机器之心的翻译&#xff01;保存下来以便以后复习方便一些&#xff01; 近日&#xff0c;Dishashree Gupta 在 Analyti…

Java注释中的Target和Retention

文章目录RetentionTarget参考&#xff1a;https://blog.csdn.net/hongxue8888/article/details/90319473 Retention 在Annotation中&#xff0c;可以使用Retention定义一个Annotation的保存范围。Retention和RetentionPolicy定义如下&#xff1a; package java.lang.annotat…

VS 2008新特性

AutomaticProperties.cs&#xff08;自动属性&#xff09;usingSystem;usingSystem.Data;usingSystem.Configuration;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Security;usingSystem.Web.UI;usingSystem.Web.UI.WebControls;usingSystem.Web.UI.WebControls.WebParts…