博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Android Pro] Gradle tip #3-Task顺序
阅读量:5942 次
发布时间:2019-06-19

本文共 4051 字,大约阅读时间需要 13 分钟。

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

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

dependsOn

我认为最直接的方式来说明的你task的执行时依赖别的task的方法就是使用dependsOn方法。 

比如下面的场景,已经存在task A,我们要添加一个task B,它的执行必须要在A执行完之后: 
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:AHello from A:BHello from B

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

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

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

insert task 

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

task A << {println 'Hello from A'}task B << {println 'Hello from B'}task C << {println 'Hello from C'}B.dependsOn AC.dependsOn B

加入我们的新的task

task B1 << {println 'Hello from B1'}B1.dependsOn BC.dependsOn B1

输出:

paveldudka$ gradle C:AHello from A:BHello from B:B1Hello from B1:CHello from C

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

multi depends

task B1 << {println 'Hello from B1'}B1.dependsOn BB1.dependsOn Q

输出:

paveldudka$ gradle B1:AHello from A:BHello from B:QHello from Q:B1Hello from B1

mustRunAfter

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

all tests

task unit << {println 'Hello from unit tests'}task ui << {println 'Hello from UI tests'}task tests << {println 'Hello from all tests!'}tests.dependsOn unittests.dependsOn ui

输出:

paveldudka$ gradle tests:uiHello from UI tests:unitHello from unit tests:testsHello from all tests!

尽管unitest和UI test会子啊test task之前执行,但是unit和ui这两个task的执行顺序是不能保证的。虽然现在来看是按照字母表的顺序执行,但这是依赖于Gradle的实现的,你的代码中绝对不能依赖这种顺序。 

由于UI测试时间远比unit test时间长,因此我希望unit test先执行。一个解决办法就是让ui task依赖于unit task。 
ui->unit

task unit << {println 'Hello from unit tests'}task ui << {println 'Hello from UI tests'}task tests << {println 'Hello from all tests!'}tests.dependsOn unittests.dependsOn uiui.dependsOn unit // <-- I added this dependency

输出:

paveldudka$ gradle tests:unitHello from unit tests:uiHello from UI tests:testsHello from all tests!

现在unit test会在ui test之前执行了。 

但是这里有个很恶心的问题,我的ui测试其实并不依赖于unit test。我希望能够单独的执行ui test,但是这里每次我执行ui test,都会先执行unit test。 
这里就要用到了。 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 unittests.dependsOn uiui.mustRunAfter unit

输出:

paveldudka$ gradle tests:unitHello from unit tests:uiHello from UI tests:testsHello from all tests!

依赖关系如下图: 

mustRunAfter

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

finalizedBy

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

merge

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 unittests.dependsOn uiui.mustRunAfter unitmergeReports.dependsOn tests

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

paveldudka$ gradle mergeReports:unitHello from unit tests:uiHello from UI tests:testsHello from all tests!:mergeReportsMerging test reports

这个task是能工作,但是看起来好笨啊。mergeReports从用户的角度来看感觉不是特别好。我希望执行tests task就可以获得测试报告,而不必知道mergeReports的存在。当然我可以把merge的逻辑挪到tests task中,但我不想把tests task搞的太臃肿,我还是继续把merge的逻辑放在mergeReports task中。 

来救场了。顾名思义,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 unittests.dependsOn uiui.mustRunAfter unitmergeReports.dependsOn teststests.finalizedBy mergeReports

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

paveldudka$ gradle tests:unitHello from unit tests:uiHello from UI tests:testsHello from all tests!:mergeReportsMerging test reports
注意,finalizedBy也是Gradle2.4的实验性功能

 

分类:  ,
本文转自demoblog博客园博客,原文链接http://www.cnblogs.com/0616--ataozhijia/p/5193977.html如需转载请自行联系原作者
demoblog
你可能感兴趣的文章
Mac笔记本中是用Idea开发工具在Java项目中调用python脚本遇到的环境变量问题解决...
查看>>
Jmeter也能IP欺骗!
查看>>
Rust 阴阳谜题,及纯基于代码的分析与化简
查看>>
ASP.NET Core的身份认证框架IdentityServer4(4)- 支持的规范
查看>>
(原創) array可以使用reference方式傳進function嗎? (C/C++)
查看>>
170多个Ionic Framework学习资源(转载)
查看>>
Azure:不能把同一个certificate同时用于Azure Management和RDP
查看>>
Directx11教程(15) D3D11管线(4)
查看>>
Microsoft Excel软件打开文件出现文件的格式与文件扩展名指定格式不一致?
查看>>
ios ble 参考
查看>>
[转]Pass a ViewBag instance to a HiddenFor field in Razor
查看>>
linux中注册系统服务—service命令的原理通俗
查看>>
基于托管C++的增删改查及异步回调小程序
查看>>
Oracle DBMS_STATS 包 和 Analyze 命令的区别
查看>>
给Visual Studio 2010中文版添加Windows Phone 7模板
查看>>
linux下基本命令
查看>>
windows server 2008R2 上安装配置freesshd
查看>>
手动删除SVCH0ST.EXE的方法
查看>>
已释放的栈内存
查看>>
Android网络之数据解析----SAX方式解析XML数据
查看>>