gradle脚本中只有task可以让配置脚本能在执行阶段执行,其他都是在配置阶段执行.
task定义及配置:
//执行 ./gradlew tasks 查看工程中有多少个task //定义1:通过task函数创建 /** * parms task name * parms coluser */ task helloTask { println("测试tasks") } //执行 ./gradlew helloTask //定义2:通过task容器TaskContainer创建, TaskContainer是task的管理类
this.tasks.create(name:'helloTask2'){ println("测试tasks2") } //定义方式1和2没有区别,TaskContainer提供了task的查找和添加方法findByPath(),getByPath(),和create() //无论哪种创建方式,最终taskContainer 都会在gradle的配置阶段构成一个有向无环图.通过这个有向无环图gradle就知道了执行顺序.
//给task进行配置 //1:定义的时候进行配置:group相同的task会被分到相同的组中. // 有设置group的task会在gradle的Tasks的同一个命名的目录下,没有设置的会统一在other目录下 task helloTask2 (group:'hexin',description:'task test'){ println("测试tasks3") } //2:调用配置方法 this.tasks.create(name:'helloTask3'){ setGroup('hexin') setDescription('tast test') println("测试tasks4") } //task可配置的参数:name,group,description,type,dependsOn:task的依赖于哪一个task, //overwrite:常用于重写task,action:为task配置要执行的逻辑
//以上task中的测试代码都没有在doFirst或doLast方法中.都是在task配置阶段执行.执行任何一个task,所有task的配置代码都会先执行,所以不管执行了哪个task
//测试tasks1,2,3,4都会输出.
//task在执行阶段执行:在闭包中调用doFirst或 doLast方法. task helloTask3 (group:'hexin',description:'task test'){ println("测试tasks") doFirst { println('task执行阶段执行方式1:闭包中调用,内部调用晚于外部调用') } } helloTask3.doFirst{ println('task执行阶段执行方式2:外部调用,外部调用先执行') } //doFirst和doLast的区别:doFist在已经有的task之前添加逻辑,doLast为已经有的task之后添加逻辑
//统计task执行阶段时长的功能 def startBuildTime,endBuildTime //afterEvaluate在配置阶段执行完,所有的task都会被创建成功了. this.afterEvaluate { //保证要找的task都已经配置完毕 Project project-> //找到最开始执行的task def preBuildTask=project.tasks.getByPath('preBuild') preBuildTask.doFirst { startBuildTime=System.currentTimeMillis(); } //找到最后执行的task def buildTask=project.tasks.getByPath('build') buildTask.doLast { endBuildTime=System.currentTimeMillis() println("build的时间差:::${endBuildTime-startBuildTime}") } }
//决定tasK执行顺序的方式:1:dependsOn 强依赖方式,2:通过task输入输出指定,3:通过api指定执行顺序 //1:添加依赖方式. tast taskX{ doLast{ println("taskX") } } tast taskY{ doLast{ println("taskY") } } tast taskZ(dependsOn:[taxkX,taskY]){ doLast{ println("taskZ") } } taskZ.dependsOn(taskX,taskY);//taskX,taskY,taskZ //这中taskX,taskY的执行顺序是随机的. //动态指定依赖,因为有时候创建的时候并不知道要依赖谁. // 例子:taskZ依赖所有以lib开头的task // << 追加符,意思就是loLast(); task lib1 <<{ println("lib1") } task lib2 <<{ println("lib2") } task nolib <<{ println("nolib") }
tast taskM{ dependsOn this.tasks.findAll { task->return task.name.startsWith('lib') } doLast{ println('taskM') } } //执行结果lib1,lib2,taskM(lib1,lib2先后随机) //task依赖实战,统计所有版本的信息. task handleReleaseFile{ def srcFile =file('realease.xml') def destDir=new File(this.getBuildDir(),'generated/release/') daLast{ println('开始解析对应的xmL文件') destDir.mkdir() def realeases=new XmlParser().parse(srcFile) realeases.release.each{ realeaseNode-> def name=realeaseNode.versionName.text() def versionCode=realeaseNode.versionCode.text() def versionInfo=realeaseNode.versionInfo.text() def destFile=new File(destDir,"realease-${name}.text") destFile.withWriter { writer->writer.write("${name}:::${versionCode}:::${versionInfo}") } } } }
//测试task handleReleaseFile的task task handleReleaseFileTest(dependsOn:handleReleaseFile){ def dir=fileTree(this.getBuildDir()+'generated/release/') doLast{ dir.each{ println('the file name is:::'+it) } println("输出完成::::::::") } }
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦