美文网首页
gradle(4)-task(1)

gradle(4)-task(1)

作者: 高斯巴 | 来源:发表于2018-11-12 15:32 被阅读0次

    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")
    }

    //通过配置阶段的task输出配置dependsOn

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

    相关文章

      网友评论

          本文标题:gradle(4)-task(1)

          本文链接:https://www.haomeiwen.com/subject/kvrcfqtx.html