为了账号安全,请及时绑定邮箱和手机立即绑定

groovy-gradle之task

标签:
Android

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("输出完成::::::::")
    }
}

原文链接:http://www.apkbus.com/blog-953329-77650.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消