Gradle 任务 -- 任务的 onlyIf 断言

2022-01-02  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读