本节内容:
- Task定义及配置
- Task执行详解
- Task的依赖和执行顺序
- Task类型
- 挂接到构建生命周期
- Task实战
Task定义
两种定义方式:
1、直接通过task函数去创建
task taskname{
println 'this is a task'
}
2、通过project的TaskContainer去创建Task
//调用tasks会返回一个TaskContainer
tasks.create('name')
{
println 'this is a task'
}
创建task的时候可以同时去指定task的一些属性,比如说group、description等
task taskname(group:'这是组名',description:'描述信息'){
println 'this is a task'
}


3、doFirst、doLast
//调用tasks会返回一个TaskContainer
tasks.create('one')
{
doFirst {
println "one测试doFirst运行"
}
doLast {
println 'one测试doLast运行'
}
println 'this is a one task'
}
tasks.create('two')
{
doFirst {
println 'two测试doFirst运行'
}
doLast {
println 'two测试doLast运行'
}
println 'this is a two task'
}

可以看到:

这两句是在执行阶段输出的

测试发现需要写在主module的gradle文件中,写在项目中的gradle文件中会报错
//计算build这个task的执行时间
//build执行的时候第一个任务是prebuild,最后执行的是build
def startTime
def endTime
this.afterEvaluate {
Project project->
//写在afterEvaluate中,保证所有的task已经配置完毕
project.tasks.getByName('preBuild').doFirst {
startTime=System.currentTimeMillis()
println "the start time is ${startTime}"
}
tasks.getByName('build').doLast {
endTime=System.currentTimeMillis()
println "the total time is ${endTime-startTime}"
}
}

4、Task之间的依赖
task taskname{
doLast {
println 'this is a task'
}
}
task taskA{
doLast {
println 'task a'
}
}
task taskB{
doLast {
println 'task b'
}
}
task taskC(dependsOn:[taskA,taskB]){
doLast {
println 'task c'
}
}
还有一种指定方式:taskC.dependsOn(taskA,taskB)
指定需要依赖的任务时可以指定一些条件:
task lib1{
doLast {
println 'task lib1'
}
}
task taskC(){
dependsOn this.tasks.findAll {
return it.name.startsWith('lib')
}
doLast {
println 'task c'
}
}
实现功能:解析releases.xml文件,将文件中每一个对应的节点release生成一个text文件,存放于generated下的release目录中

task handleReleaseFile{
//定义要被解析的xml文件
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{
def name=it.versionCode.text()
def code=it.versionName.text()
def desc=it.versionInfo.text()
//创建文件并写入节点信息
def destFile=new File(destDir,"release-${name}.text")
destFile.withWriter {
it.write("${name}->${code}->${desc}")
}
}
}
}
5、Task的输入输出

简而言之:一个任务的输出可以作为另一个文件的输入
例子省略了,哈哈哈
6、将自定义的task挂接到系统task之后
task customeTask{
doLast{
println '测试自定义任务挂接到系统任务后'
}
}
this.afterEvaluate {
Project project->
//写在afterEvaluate中,保证所有的task已经配置完毕
tasks.getByName('build').doLast {
customeTask.execute()
}
}
网友评论