Android Gradle 学习笔记(五):Gradle 任务 Task

在以前的学习中,咱们了解到Gradle的构建工做都是由Task组合完成的。本节咱们就来介绍一下 Task - 任务。网络

1、多种方式建立任务

在Gradle中,咱们能够有不少种方式来建立任务。为何有这么多种方式呢?这都依赖于Project提供的快捷方法以及TaskContainer提供的相关Create方法。因此咱们阅读一些Gradle脚本的时候,见到一些不熟悉的建立任务的方法也不要奇怪,通常分为如下几种方式:闭包

  • 第一种:直接以一个任务名字建立任务。
  • 第二种:以一个任务名字+一个对该任务配置的Map对象来建立任务。
  • 第三种:任务名字+闭包配置。
  • 第四种:任务名字+Map参数+闭包。
  • 第五种:使用TaskContainer建立任务,调研tasks.create方法建立任务。

2、多种方式访问任务

其实咱们在以前的学习的例子中,咱们已经经过了一些方式访问了任务。下面咱们整理一下相关的方式:app

  • 第一种:咱们建立的任务都会做为项目(Project)的一个属性,属性名就是任务名,因此咱们能够经过该任务名称访问和操做该任务。
  • 第二种:任务都是经过TaskContainer建立的,TaskContainer就是咱们建立任务的集合,在Project中咱们能够经过tasks属性访问TaskContainer,因此咱们能够以访问集合元素的方式访问咱们的任务。
  • 第三种:经过路径访问。方式有两种:get & find,区别在于get的时候找不到就会抛出UnknownTaskException异常,而find在找不到任务的时候会返回null。
  • 第四种:经过名称访问。经过名字的访问也有两种:get & find,它们的区别和上面第三种介绍的同样。

值得强调的是,经过路径访问的时候,参数能够是任务路径也能够是任务的名字。可是经过名字访问的时候,参数值只能是任务的名字,不能为路径。工具

3、任务排序

其实并无真正的任务排序功能,这个排序不像咱们想象的经过设置优先级或者Order顺序实现,而是经过任务的shouldRunAfter和mustRunAfter这两个方法,它们能够控制一个任务应该或者必定在某个任务以后执行。经过这种方式,你能够在某些状况下控制任务的执行顺序,而不是经过强依赖的方式。单元测试

这个功能是很是有用的,好比咱们设置的顺序是,必须先执行单元测试,而后才能进行打包,这就保证了App的质量。相似的状况还有不少,好比必需要单元测试以后,才能进行集成测试,打包成功以后才能进行部署发布等。学习

举例说明:测试

  • taskB.shouleRunAfter(taskA):表示taskB应该在taskA执行以后执行,这里的应该而不是必须。因此有可能任务顺序并不会按预设的执行。
  • taskB.mustRunAfter(taskA):表示taskB必须在taskA执行以后执行,这个规则相对更加严格。

4、任务的onlyIf断言

断言就是一个条件表达式。Task有一个onlyIf方法,它接受一个闭包做为参数,若是该闭包返回true,则该任务执行,不然就跳过。这有不少用途,好比控制程序哪些状况下打什么包,何时进行单元测试,什么状况下执行单元测试的时候不执行网络测试。ui

下面咱们以一个打首发包的例子来讲明:spa

final String BUILD_APPS_ALL="all";
final String BUILD_APPS_SHOUFA="shoufa";
final String BUILD_APPS_EXCLUDE_SHOUFA="exclude_shoufa";

task ex48QQRelease << {
    println "打应用宝的包"
}
task ex48BaiduRelease << {
    println "打百度的包"
}
task ex48HuaweiRelease << {
    println "打华为的包"
}

task ex48MiuiRelease << {
    println "打Miui的包"
}

task build {
    group BasePlugin.BUILD_GROUP
    description "打渠道包"
}

build.dependsOn ex48QQRelease,ex48BaiduRelease,ex48HuaweiRelease,ex48MiuiRelease

ex48QQRelease.onlyIf {
    def execute = false;
    if(project.hasProperty("build_apps")){
        Object buildApps = project.property("build_apps")
        if(BUILD_APPS_SHOUFA.equals(buildApps)
            || BUILD_APPS_ALL.equals(buildApps)){
            execute = true
        }else{
            execute = false
        }
    }else{
        execute = true
    }
    execute
}

ex48BaiduRelease.onlyIf {
    def execute = false;
    if(project.hasProperty("build_apps")){
        Object buildApps = project.property("build_apps")
        if(BUILD_APPS_SHOUFA.equals(buildApps)
                || BUILD_APPS_ALL.equals(buildApps)){
            execute = true
        }else{
            execute = false
        }
    }else{
        execute = true
    }
    execute
}

ex48HuaweiRelease.onlyIf {
    def execute = false;
    if(project.hasProperty("build_apps")){
        Object buildApps = project.property("build_apps")
        if(BUILD_APPS_EXCLUDE_SHOUFA.equals(buildApps)
                || BUILD_APPS_ALL.equals(buildApps)){
            execute = true
        }else{
            execute = false
        }
    }else{
        execute = true
    }
    execute
}

ex48MiuiRelease.onlyIf {
    def execute = false;
    if(project.hasProperty("build_apps")){
        Object buildApps = project.property("build_apps")
        if(BUILD_APPS_EXCLUDE_SHOUFA.equals(buildApps)
                || BUILD_APPS_ALL.equals(buildApps)){
            execute = true
        }else{
            execute = false
        }
    }else{
        execute = true
    }
    execute
}

在例子中,咱们定义了4个渠道,其中百度和应用宝是首发包,另外两个华为和MiUi不是首发包,经过build_apps属性来控制咱们要打哪些渠道包。经过这种方式,咱们在进行一些相关流程控制上会更加灵活。这在咱们使用JenKins等CI工具进行自动化打包和部署的时候就能很好的体现出来。code

相关文章
相关标签/搜索