美文网首页
Gradle 任务 -- 任务的 onlyIf 断言

Gradle 任务 -- 任务的 onlyIf 断言

作者: 冯可乐同学 | 来源:发表于2022-01-02 09:13 被阅读0次

    ----《Android Gradle 权威指南》学习笔记

    总目录:Gradle 学习系列 -- 目录

    上一篇:Gradle 任务 -- 任务的弃用和禁用

    下一篇:Gradle 任务 -- 任务规则

    1. 断言就是一个条件表达式。 Task 有一个 onlyIf 方法,它接受一个闭包作为参数,如果该闭包返回 true 则该任务执行,否则跳过。

    2. 这种方式有很多用途,比如控制程序哪些情况下打什么包,什么时候执行单元测试,什么情况下执行单元测试但不需要测试网络等。

    3. 举个栗子,假如项目的首发渠道是应用宝和百度,直接执行 build 会编译出所有包,这样会太慢也不符合要求,就可以采用 onlyIf 的方式通过属性来控制。在 build.gradle 中有以下代码:

    final String BUILD_APP_ALL = "all";
    final String BUILD_APP_SHOUFA = "shoufa";
    final String BUILD_APP_EXCLUDE_SHOUFA = "exclude_shoufa";
    
    task taskQQRelease{
        doLast{
            println "打包 QQ 应用应用市场的包"
        }
    }
    
    task taskBaiduRelease{
        doLast{
            println "打包百度应用市场的包"
        }
    }
    
    task taskHuaWeiRelease{
        doLast{
            println "打包华为应用市场的包"
        }
    }
    
    task taskMiuiRelease{
        doLast{
            println "打包 MIUI 应用市场的包"
        }
    }
    
    task build{
        group BasePlugin.BUILD_GROUP
        description "打渠道包"
    }
    
    
    build dependsOn taskQQRelease, taskBaiduRelease, taskHuaWeiRelease, taskMiuiRelease
    
    taskQQRelease.onlyIf {
        def execute = false;
        if(project.hasProperty("build_apps")){
            Object buildApps = project.property("build_apps")
            if(BUILD_APP_ALL.equals(buildApps)){
                execute = true
            }else{
                execute = false
            }
        }else{
            execute = false
        }
        execute
    }
    
    taskBaiduRelease.onlyIf {
        def execute = false;
        if(project.hasProperty("build_apps")){
            Object buildApps = project.property("build_apps")
            if(BUILD_APP_SHOUFA.equals(buildApps) || BUILD_APP_ALL.equals(buildApps)){
                execute = true
            }else{
                execute = false
            }
        }else{
            execute = false
        }
        execute
    }
    
    taskHuaWeiRelease.onlyIf{
        def execute = false;
        if(project.hasProperty("build_apps")){
            Object buildApps = project.property("build_apps")
            if(BUILD_APP_SHOUFA.equals(buildApps) || BUILD_APP_ALL.equals(buildApps)){
                execute = true
            }else{
                execute = false
            }
        }else{
            execute = false
        }
        execute
    }
    
    taskMiuiRelease.onlyIf{
        def execute = false;
        if(project.hasProperty("build_apps")){
            Object buildApps = project.property("build_apps")
            if(BUILD_APP_EXCLUDE_SHOUFA.equals(buildApps) || BUILD_APP_ALL.equals(buildApps)){
                execute = true
            }else{
                execute = false
            }
        }else{
            execute = false
        }
        execute
    }
    

    (1) 在命令行中执行命令:gradle build,没有任何打印结果。

    (2) 在命令行中执行命令:gradle build -Pbuild_apps=all
    打印结果:

    > Task :taskBaiduRelease
    打包百度应用市场的包
    
    > Task :taskHuaWeiRelease
    打包华为应用市场的包
    
    > Task :taskMiuiRelease
    打包 MIUI 应用市场的包
    
    > Task :taskQQRelease
    打包 QQ 应用应用市场的包
    

    (3) 在命令行中执行命令:gradle build -Pbuild_apps=shoufa
    打印结果:

    > Task :taskBaiduRelease
    打包百度应用市场的包
    
    > Task :taskHuaWeiRelease
    打包华为应用市场的包
    

    (4) 在命令行中执行命令:gradle build -Pbuild_apps=exclude_shoufa
    打印结果:

    > Task :taskMiuiRelease
    打包 MIUI 应用市场的包
    

    说明:命令行中 -P 是为 Project 指定 K-V 格式的键值对,使用格式为: -PK=V。

    从打印结果可以看出,通过设置不同的参数就可以控制打包的渠道。

    相关代码:https://gitee.com/fzq.com/gradle-demos

    相关文章

      网友评论

          本文标题:Gradle 任务 -- 任务的 onlyIf 断言

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