文章目录
- 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