由于任务作为Gradle的核心功能模块,多花点精力是值得的,本文继上一篇主要涉及到:任务的执行顺序、为任务添加组和描述、跳过任务、扩展任务属性、定义默认任务。

任务顺序

如果构建(build)不能在清理(clean)之前执行,因为这样无意义;构建之前必须先验证;做集成测试前先做单元测试等就必须指定其任务的执行顺序。

任务依赖的顺序

指定顺序不同于任务间的依赖顺序:依赖是影响那些任务执行,而顺序是影响这些要执行的任务之间的顺序。

task hello{
    doLast{
        print 'hello'
    }
}

task aline{
    doLast{
        print ' - '
    }
}

task world(dependsOn:[hello,aline]){
    doLast{
        println 'world!'
    }
}

当执行world任务时,执行的顺序是aline,hello,world,输出

- helloworld!

可见当任务有多个依赖时,会先执行被依赖的任务,而被依赖的任务执行顺序是依据任务名的字典顺序。你可以自定义顺序如

aline.mustRunAfter hello

则aline任务必须在hello之后执行,输出

hello - world!

指定顺序

指定顺序是通过两个关键词来设定的:mustRunAfter和shouldRunAfter,前者是严格指定的,而后者比较宽松,在两种情况下不按照指定的顺序执行:

  • 如果使用它产生循环顺序时,如指定了taskA在taskB之后,而又指定了taskB在taskA之后。
  • 这种情况官方文档貌似没说清楚?!!!后续再研究下源码看看。

    bash task taskX { doLast { println 'taskX' } } task taskY { doLast { println 'taskY' } } task taskZ { doLast { println 'taskZ' } } taskX.dependsOn taskY taskY.dependsOn taskZ taskZ.shouldRunAfter taskX

    执行

    $ gradle -q taskX

    taskZ

    taskY

    taskX

添加描述与组

可以通过关键词description和grou为任务添加描述和组,然后可以使用gradle tasks来查看,如果改任务没有组,则需要额外参数--all来查看。

task description{
    group 'mine'
    description 'this is just a description.'
}

查看

Mine tasks

----------

description - this is just a description.

替换任务

有时根据需要,你可能想替换一个任务,这个很简单:更加任务名进行重写:

task overwriteTask{
    doLast{
        println 'this is a str task';
    }
}

task overwriteTask(overwrite:true){
    doLast{
        println 'this is a new overwrite str task.'
    }
}

执行

$ gradle -q oT

this is a new overwrite str task.

跳过任务

Gradle提供多种跳过任务的方法,不仅有命令行形式的,还有代码级别的。

命令行

当你想跳过依赖的任务时,可以使用-x形式跳过,如执行build跳过单元测试时:

$ gradle build -x test
断言

你可以使用onlyIf()来做单元,当其返回值为true时被执行,否则跳过.

task hello{
    doLast{
        println 'hello world!'
    }
}

hello.onlyIf{!project.hasProperty('skipHello')}

当执行gradle hello -PskipHello 时,任务hello并不会执行。命令行参数-P为命令行设置property。

StopExecutionException

当任务抛出StopExecutionException将跳过任务继续执行下一个任务。

task hello{
    doLast{
        print 'hello '
    }
}
hello.doFirst{
    throw new StopExecutionException()
}

task world(dependsOn:hello){
    doLast{
        println 'world!'
    }
}

执行任务world即可看到效果。

enabled属性

每个任务都有一个enabled属性,设置为false将跳过。

task hello{
    doLast{
        print 'hello '
    }
}
hello.enabled = false

task world(dependsOn:hello){
    doLast{
        println 'world!'
    }
}

扩展属性

你可以通过ext来扩展任务的属性

task hello{
    ext.str="hello world!"
}

task say(){
    doLast{
        println hello.str
    }
}

默认任务

Gradle允许你使用关键词defaultTasks定义一个或多个任务作为默认任务,当没有任务指定时则执行默认任务。

defaultTasks 'hello','intro'

task hello{
    doLast{
        println 'hello,welcome to you!'
    }
}

task intro(){
    doLast{
        println 'my name is zhai'
    }
}

可以执行gradle -q来验证。

未完待续....


更多原创文章可关注我的个人博客:宅前疯 或微信公众账号

Gradle之恋-任务2的更多相关文章

  1. Gradle之恋-任务1

    任务作为Gradle的核心功能模块,而且Gradle的任务还可以具有自己的属性和方法,大大扩展了Ant任务的功能.由于任务相关内容比较多,分为两篇来探讨,本篇主要涉及到:任务的定义.任务的属性.任务的 ...

  2. Gradle之恋-命令行详解

    虽然很多童鞋都必须要用IDE,但有些命令是IDE很难表现出来的,还是命令行返璞归真.本文就带你来剖析Gradle的命令行. 本文不包括试验性(incubating)的选项,如--configure-o ...

  3. Gradle配置APK自动签名完整流程

    转载请注明出处:http://www.cnblogs.com/LT5505/p/6256683.html 一.生成签名 1.命令行生成签名,输入命令keytool -genkey -v -keysto ...

  4. gradle学习笔记(1)

    1. 安装     (1) 下载最新gradle压缩包,解压到某处.地址是:Gradle web site:     (2) 添加环境变量:             1) 变量名:GRADLE_HOM ...

  5. Gradle 实现 Android 多渠道定制化打包

    Gradle 实现 Android 多渠道定制化打包 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在项目中遇到需要实现 Apk 多渠道.定制化打包, Google .百度查找了一些资料, ...

  6. 解决 Could not find com.android.tools.build:gradle 问题

    今天拉同事最新的代码,编译时老是报如下错误: Error:Could not find com.android.tools.build:gradle:2.2.0.Searched in the fol ...

  7. React Native Android gradle下载慢问题解决

    很多人会遇到 初次运行 react-native run android的时候 gradle下载极慢,甚至会失败的问题 如下图 实际上这个问题好解决的 首先 把对应版本的gradle下载到本地任意一个 ...

  8. Android studio使用gradle动态构建APP(不同的包,不同的icon、label)

    最近有个需求,需要做两个功能相似的APP,大部分代码是一样的,只是界面不一样,以前要维护两套代码,比较麻烦,最近在网上找资料,发现可以用gradle使用同一套代码构建两个APP.下面介绍使用方法: 首 ...

  9. 对Maven、gradle、svn、spring 3.0 fragment、git的想法

    1.Maven Maven可以构建项目,采用pom方式配置主项目和其他需要引用的项目.同时可结合spring3.0的新特性web  fragment. 从现实出发,特别是对于管理不到位,程序员整体素质 ...

随机推荐

  1. mark笔记

    1.[cocos2dx]ccnode跟ccui节点混用时注意touch层级问题,基本不可控

  2. 支持wmv、mpg、mov、avi格式的网页视频播放代码

    这2天一直在整金网奖的相关项目,比较头大的就是网页视频播放了,需要考虑各种不同格式的视频,然后找相应的视频播放器. 这次使用了2种方法对这些视频进行处理: 1.使用ckplayer网页视频播放器 ck ...

  3. Struts2 属性驱动、模型驱动、异常机制

    模型驱动使用单独的VO(值对象)来封装请求参数和处理结果,属性驱动则使用Action实例来封装请求参数和处理结果. 一.使用模型驱动 1.login.action采用模型驱动模式实现,采用模型驱动时必 ...

  4. iOS 属性之assign、copy、retain

    参考自:http://blog.csdn.net/getchance/article/details/42213219 参考自:http://zhidao.baidu.com/link?url=Xmn ...

  5. Refused to set unsafe header "Connection"

    参考 http://stackoverflow.com/questions/7210507/ajax-post-error-refused-to-set-unsafe-header-connectio ...

  6. PHP扩展之多线程

    PHP一直以为不支持多线程,后面才知道有基于pThread的扩展包,地址如下: http://php.net/manual/zh/book.pthreads.php 我感兴趣的是以下几个点: 1.Th ...

  7. 如何从mysql中将数据导入到sqlserver

    本文讨论如何把MySQL的数据库导入到SQL Server中,所以首先你需要把两种数据库都安装了,再进行以下步骤. 一.为 MySQL安装ODBC驱动 1. 下载MySQL ODBC Connecto ...

  8. macOS Sierra安装Apache2.4+PHP7.0+MySQL5.7.16

    Mac系统上虽然自带PHP和Apache,但是有时不是我们想要的版本呢.今天我们就在macOS Sierra(10.12.1)上安装比较新的版本的PHP版本,也就是PHP7.0+了.本篇博客我们安装的 ...

  9. ubuntu开机自动关闭独显,使用集成显卡

    我的本子是联想y470p-ise,因为是有双显卡,而ubuntu在开机后,双显卡默认是同时工作,会产生巨大的发热,导致很不爽.而且在ubuntu下基本我也不用独显,所以有开机关闭独显的需求. ubun ...

  10. 微信小程序开发系列(二)小程序的全局文件

    其实你已经知道了小程序的文件结构 上一节讲到,小程序的页面由三部分组成: 视图(.wxml).逻辑(.js).样式(.wxss). 我们这次重新展开文件结构: 小程序用到的文件类型只有四种,正如你所看 ...