zoukankan      html  css  js  c++  java
  • Gradle技术之四

    1 Gradle的Task详解

    • 1 Task定义和配置
    • 2 Task的执行
    • 3 Task的依赖和执行顺序
    • 4 Task类型
    • 5 Task结合gradle的生命周期
    • 6 Task实战

    1.1 Task定义和配置

    1.1.1 查看所有的task

    ./gradlew tasks
    输出
    > Task :tasks 
    
    ------------------------------------------------------------
    All tasks runnable from root project
    ------------------------------------------------------------
    
    Android tasks
    -------------
    androidDependencies - Displays the Android dependencies of the project.
    signingReport - Displays the signing info for each variant.
    sourceSets - Prints out all the source sets defined in this project.
    
    Build tasks
    -----------
    assemble - Assembles all variants of all applications and secondary packages.
    
    .....
    
    

    1.1.1 新建一个task

    可以使用project的task()方法创建一个task,也可以使用project的TaskContainer去创建task,这两种方法创建的task没有任何区别,TaskContainer就是方便project管理task用的,通过TaskContainer可以对project下的task进行管理,比如创建,查找task等

    
    //第一种方法,直接使用project的task()方法创建
    task helloTask{
        println 'this is helloTask'
    }
    
    
    //第二种方法,使用TaskContainer创建task
    this.tasks.create(name:'helloTask2'){
        println 'this is helloTask2'
    }
    

    1.1.2 对task进行配置

    有两种方法可以对task进行配置
    1 创建的时候就对task进行配置
    2 在闭包中对task进行配置

    //第一种方法,直接使用project的task()方法创建
    //第一种配置方法,创建的时候就配置task的group和description
    //description就是个说明,类似对注释
    task helloTask(group:'hard',description:'task learn'){
        println 'this is helloTask'
    }
    
    
    //第二种方法,使用TaskContainer创建task
    this.tasks.create(name:'helloTask2'){
        //第二种配置方式:直接在闭包中配置
        setGroup('hard')
        setDescription('task learn')
        println 'this is helloTask2'
    }
    
    

    通过配置以后,就可以在右侧的面板中看到task了,如下图:

    1.1.3 task的执行顺序

    //第一种方法,直接使用project的task()方法创建
    //配置的时候就配置task的group和description
    //description就是个说明,类似对注释
    task helloTask(group:'hard',description:'task learn'){
    
        //直接写在闭包里面的,是在配置阶段就执行的
        println 'this is helloTask'
    
        doFirst {
            println 'task in do first'  //运行任务时,会第一个执行
        }
    
        doLast {
            println 'task in do last'   //运行任务时,会最后一个执行
        }
    }
    
    

    doFirst和doLast中的代码,不执行这个任务时,是不会执行的,但是直接写在闭包中的,就也是在这两个函数外的代码,是在配置阶段就会执行的。运行任务时,doFirst中的代码最先执行,doLast中的代码最后执行

    切记大部分的内容是写在 doLast{} 或 doFirst{} 闭包中,因为写在如果写在 task 闭包中的话,会在 Configuration 阶段也被执行。

    1.1.4 计算build编译时间

    def startBuildTime
    def endBuildTime
    
    //配置完后,所有的task的拓扑图都已经生成好了
    //保证要找的task已经配置完毕
    this.afterEvaluate { Project project ->
        
        //找到第一个执行的task
        def preBuildTask = project.tasks.getByName('preBuild')
        preBuildTask.doFirst {
            startBuildTime = System.currentTimeMillis()
            println 'the start time is:' + startBuildTime
        }
    
        //找到最后一个编译的build任务
        def buildTask = project.tasks.getByName('build')
        buildTask.doLast {
            endBuildTime = System.currentTimeMillis()
            println 'the build time is:' + (endBuildTime - startBuildTime)
        }
    }
    
    

    1.1.5 task依赖
    task之间是有依赖关系的,比如taskA 依赖 taskB,那么在执行taskA的时候,Gradle会先执行taskB,再执行taskA,我们可以在定义一个task的时候,指定task的依赖关系:

    task taskB {
        doLast {
            println '我是taskB'
        }
    }
    
    //定义一个taskA,且依赖于taskB
    task taskA(dependsOn: taskB) {
        doLast {
            println '我是taskA'
        }
    }
    
    //运行
    ./gradlew taskA
    
    输出
    > Task :app:taskB 
    我是taskB
    
    > Task :app:taskA 
    我是taskA
    
    

    或者定义taskA,taskB之后,再定义依赖关系:

    task taskB {
        doLast {
            println '我是taskB'
        }
    }
    
    //定义一个taskA
    task taskA() {
        doLast {
            println '我是taskA'
        }
    }
    
    //定义之后,再依赖于taskB
    taskA.dependsOn taskB
    
    //运行
    ./gradlew taskA
    
    输出
    > Task :app:taskB 
    我是taskB
    
    > Task :app:taskA 
    我是taskA
    

    一个task也可以依赖多个task,依赖多个task的话,直接在denpendsOn后面跟一个task列表:

    taskA.dependsOn 'taskB','taskC'
    或者在定义的时候
    task taskA(dependsOn:['taskB','taskC']) {
        doLast {
            println '我是taskA'
        }
    }
    

    执行taskA的时候,先执行taskB,taskC,但是taskB,taskC的执行顺序是随机的。

    1.1.6 将自定义的task挂到构建过程中去
    比如有这样一个需求,我们需要在build之后,就执行我们的task,应该怎么写呢?
    这就是把我们自定义的task挂到build后,代码如下:

    afterEvaluate{ project ->
        def buildTask = project.tasks.findByName('build')
        if(buildTask == null){
            throw new GradleException('the build task is not found')
        }
    
        //在buildTask后添加doLast,并在里面执行printTask
        //这样我们就把自定义的task挂到build构建过程中了
        buildTask.doLast {
            printTask.execute()
        }
    }
    
    

    SourceSets类的作用

    SourceSets类的作用就是定义去哪找源文件,去哪找资源文件,库文件等,那么为什么我们平时不用定义也会知道去哪找这些东西呢?那是因为gradle有个约定的配置,如果没有指定,就会使用约定的。所以我们修改这些位置。如下:

      sourceSets {
            main {
                jniLibs.srcDirs = ['libs'] //修改so库存放的位置
            }
        }
    
        sourceSets {
            main {
                //修改资源文件的位置
                // res存放公共的资源,res-ad 存放广告资源,res-player存放播放器资源
                res.srcDirs = ['src/main/res', 'src/main/res-ad', 'src/main/res-player']
            }
        }
    
  • 相关阅读:
    Python进阶2.3 with的使用
    thinkswoole 跨域
    调用windows服务来监视文件夹状态
    IIS 文件名、目录名或卷标语法不正确解决方法一例
    jqgrid 动态列生成
    Oracle 术语解释 只有一部分
    招聘.NET高级软件工程师
    Zabbix监控集群操作用户“登录失败次数“和“失败日志记录“
    Gin框架组合(Zap、lumberjack、ini)使用手册
    逛书城有感
  • 原文地址:https://www.cnblogs.com/start1225/p/9965621.html
Copyright © 2011-2022 走看看