[Android Pro] Gradle tip #3-Task顺序

reference to : http://blog.csdn.net/lzyzsd/article/details/46935405

原文链接

我注意到我在使用Gradle的时候遇到的大多数问题都是和task的执行顺序有关的。很明显如果我的构建会工作的更好如果我的task都是在正确的时候执行。下面我们就深入了解一下如何更改task的执行顺序。

dependsOn

我认为最直接的方式来说明的你task的执行时依赖别的task的方法就是使用dependsOn方法。
比如下面的场景,已经存在task A,我们要添加一个task B,它的执行必须要在A执行完之后:

这是一个很简单的场景,假定A和B的定义如下:

task A << {println ‘Hello from A‘}
task B << {println ‘Hello from B‘}

只需要简单的调用B.dependsOn A,就可以了。
这意味着,只要我执行task B,task A都会先执行。

paveldudka$ gradle B
:A
Hello from A
:B
Hello from B

另外,你也可以在task的配置区中来声明它的依赖:

task A << {println ‘Hello from A‘}
task B {
    dependsOn A
    doLast {
        println ‘Hello from B‘
    }
}

如果我们想要在已经存在的task依赖中插入我们的task该怎么做呢?


过程和刚才类似。假定已经存在如下的task依赖:

task A << {println ‘Hello from A‘}
task B << {println ‘Hello from B‘}
task C << {println ‘Hello from C‘}

B.dependsOn A
C.dependsOn B

加入我们的新的task

task B1 << {println ‘Hello from B1‘}
B1.dependsOn B
C.dependsOn B1

输出:

paveldudka$ gradle C
:A
Hello from A
:B
Hello from B
:B1
Hello from B1
:C
Hello from C

注意dependsOn把task添加到依赖的集合中,所以依赖多个task是没有问题的。

task B1 << {println ‘Hello from B1‘}
B1.dependsOn B
B1.dependsOn Q

输出:

paveldudka$ gradle B1
:A
Hello from A
:B
Hello from B
:Q
Hello from Q
:B1
Hello from B1

mustRunAfter

现在假定我又一个task,它依赖于其他两个task。这里我使用一个真实的场景,我有两个task,一个单元测试的task,一个是UI测试的task。另外还有一个task是跑所有的测试的,它依赖于前面的两个task。

task unit << {println ‘Hello from unit tests‘}
task ui << {println ‘Hello from UI tests‘}
task tests << {println ‘Hello from all tests!‘}

tests.dependsOn unit
tests.dependsOn ui

输出:

paveldudka$ gradle tests
:ui
Hello from UI tests
:unit
Hello from unit tests
:tests
Hello from all tests!

尽管unitest和UI test会子啊test task之前执行,但是unit和ui这两个task的执行顺序是不能保证的。虽然现在来看是按照字母表的顺序执行,但这是依赖于Gradle的实现的,你的代码中绝对不能依赖这种顺序。
由于UI测试时间远比unit test时间长,因此我希望unit test先执行。一个解决办法就是让ui task依赖于unit task。

task unit << {println ‘Hello from unit tests‘}
task ui << {println ‘Hello from UI tests‘}
task tests << {println ‘Hello from all tests!‘}

tests.dependsOn unit
tests.dependsOn ui
ui.dependsOn unit // <-- I added this dependency

输出:

paveldudka$ gradle tests
:unit
Hello from unit tests
:ui
Hello from UI tests
:tests
Hello from all tests!

现在unit test会在ui test之前执行了。
但是这里有个很恶心的问题,我的ui测试其实并不依赖于unit test。我希望能够单独的执行ui test,但是这里每次我执行ui test,都会先执行unit test。
这里就要用到mustRunAfter了。
mustRunAfter并不会添加依赖,它只是告诉Gradle执行的优先级如果两个task同时存在。比如我们这里就可以指定
ui.mustRunAfter unit,这样如果ui task和unit task同时存在,Gradle会先执行unit
test,而如果只执行gradle ui,并不会去执行unit task。

task unit << {println ‘Hello from unit tests‘}
task ui << {println ‘Hello from UI tests‘}
task tests << {println ‘Hello from all tests!‘}

tests.dependsOn unit
tests.dependsOn ui
ui.mustRunAfter unit

输出:

paveldudka$ gradle tests
:unit
Hello from unit tests
:ui
Hello from UI tests
:tests
Hello from all tests!

依赖关系如下图:

mustRunAfter在Gradle2.4中目前还是实验性的功能。

finalizedBy

现在我们已经有两个task,unit和ui,假定这两个task都会输出测试报告,现在我想把这两个测试报告合并成一个:

task unit << {println ‘Hello from unit tests‘}
task ui << {println ‘Hello from UI tests‘}
task tests << {println ‘Hello from all tests!‘}
task mergeReports << {println ‘Merging test reports‘}

tests.dependsOn unit
tests.dependsOn ui
ui.mustRunAfter unit
mergeReports.dependsOn tests

现在如果我想获得ui和unit的测试报告,执行task mergeReports就可以了。

paveldudka$ gradle mergeReports
:unit
Hello from unit tests
:ui
Hello from UI tests
:tests
Hello from all tests!
:mergeReports
Merging test reports

这个task是能工作,但是看起来好笨啊。mergeReports从用户的角度来看感觉不是特别好。我希望执行tests task就可以获得测试报告,而不必知道mergeReports的存在。当然我可以把merge的逻辑挪到tests task中,但我不想把tests task搞的太臃肿,我还是继续把merge的逻辑放在mergeReports task中。
finalizeBy来救场了。顾名思义,finalizeBy就是在task执行完之后要执行的task。修改我们的脚本如下:

task unit << {println ‘Hello from unit tests‘}
task ui << {println ‘Hello from UI tests‘}
task tests << {println ‘Hello from all tests!‘}
task mergeReports << {println ‘Merging test reports‘}

tests.dependsOn unit
tests.dependsOn ui
ui.mustRunAfter unit
mergeReports.dependsOn tests

tests.finalizedBy mergeReports

现在执行tests task就可以拿到测试报告了:

paveldudka$ gradle tests
:unit
Hello from unit tests
:ui
Hello from UI tests
:tests
Hello from all tests!
:mergeReports
Merging test reports
注意,finalizedBy也是Gradle2.4的实验性功能
时间: 2024-07-30 20:30:41

[Android Pro] Gradle tip #3-Task顺序的相关文章

[Android Pro] Gradle Tips#1-tasks

reference to : http://trickyandroid.com/gradle-tip-1-tasks/ http://blog.csdn.net/lzyzsd/article/details/46934187 今天要讲的就是Gradle tasks以及task的配置和运行.可能有的读者还不了解Gradle task,用真实的例子来展示应该更容易被理解.下面的代码展示了三个Gradle task,稍后会讲解这三者的不同. task myTask { println "Hello,

[Android Pro] Gradle Tips#2-语法

referece to : http://blog.csdn.net/lzyzsd/article/details/46935063 在第一篇博客中,我讲解了关于tasks和构建过程中task的不同阶段.在写完这篇之后,我意识到我应该更详尽的讲述一下Gradle.弄懂语法很重要,免得我们碰到复杂的构建脚本的时候直接晕菜.这篇文章我就会讲解一些语法上的东西. 语法 Gradle脚本是使用Groovy语言来写的.Groovy的语法有点像Java,希望你能接受它. 如果你对Groovy已经很熟悉了,可

Gradle之Android Gradle Plugin 主要 Task 分析(三)

[Android 修炼手册]Gradle 篇 -- Android Gradle Plugin 主要 Task 分析 预备知识 理解 gradle 的基本开发 了解 gradle task 和 plugin 使用及开发 了解 android gradle plugin 的使用 看完本文可以达到什么程度 了解 android gradle plugin 中各个 task 作用 了解 android gradle plugin 中主要 task 的实现 阅读前准备工作 1.项目添加 android

zz深入理解Android之Gradle

http://blog.csdn.net/innost/article/details/48228651 Gradle是当前非常“劲爆”得构建工具.本篇文章就是专为讲解Gradle而来.介绍Gradle之前,先说点题外话. 一.题外话 说实话,我在大法工作的时候,就见过Gradle.但是当时我一直不知道这是什么东西.而且大法工具组的工程师还将其和Android Studio大法版一起推送,偶一看就更没兴趣了.为什么那个时候如此不待见Gradle呢?因为我此前一直是做ROM开发.在这个层面上,我们

深入理解Android之Gradle

深入理解Android之Gradle 格式更加精美的PDF版请到:http://vdisk.weibo.com/s/z68f8l0xTYrZt 下载 Gradle是当前非常"劲爆"得构建工具.本篇文章就是专为讲解Gradle而来.介绍Gradle之前,先说点题外话. 一.题外话 说实话,我在大法工作的时候,就见过Gradle.但是当时我一直不知道这是什么东西.而且大法工具组的工程师还将其和Android Studio大法版一起推送,偶一看就更没兴趣了.为什么那个时候如此不待见Gradl

Android下gradle编译代码及混淆

1.什么是Gradle? 百度百科说:Gradle 是以 Groovy 语言为基础,面向Java应用为主,基于DSL语法的自动化构建工具. 功能: gradle对多工程的构建支持很出色,工程依赖是gradle的第一公民. gradle支持局部构建. 支持多方式依赖管理:包括从maven远程仓库.nexus私服.ivy仓库以及本地文件系统的jars或者dirs gradle是第一个构建集成工具(the first build integration tool),与ant.maven.ivy有良好的

android开发里跳过的坑-AS导入NDK工程提示错误 No such property: sdkHandler for class: com.android.build.gradle.LibraryPlugin

接到一个NDK工程需要调试,导入后发现总是提示错误 Error:(37, 1) A problem occurred evaluating project ':libuvccamera'.> No such property: sdkHandler for class: com.android.build.gradle.LibraryPlugin 百度上各种说法,有说要降低gadle版本,有说要在环境变量里配置ANDROID_NDK的路径,试验了都不行,最后参考别人NDK gradle文件修改如

Android 使用Gradle加Android Studio 多渠道打包

转载请注明出处: http://blog.csdn.net/jjwwmlp456/article/details/45057067  ----------------- 匆忙拥挤repeat Gradle,这个东西好复杂,不过在Android中,我们知道它大概怎么用,它的依据何来,就够了. Gradle的DSL,领域特定语言(domain-specific languages,简称DSL),地址:http://gradle.org/docs/2.3/dsl/ Gradle的用户指南,地址:htt

Android Studio 查找aar依赖的顺序

Android Studio 查找aar依赖的顺序: Searched in the following locations: file:/E:/android_studio/sdk/extras/m2repository//netframe-debug//netframe-debug-.pom file:/E:/android_studio/sdk/extras/m2repository//netframe-debug//netframe-debug-.aar file:/E:/android