个人博客:

http://www.milovetingting.cn

Gradle任务

多种方式创建任务

1、直接以一个任务名字创建一个任务的方式:

def Task task1 = task(task1)
task1.doLast{
println 'task1'
}

这种方式的创建其实是调用Project对象中的task(String name)方法。该方法的完整定义:

Task task(String name) throws InvalidUserDataException

2、以一个任务名字+一个对该任务配置的Map对象来创建任务:

def Task task2 = task(task2,group:BasePlugin.BUILD_GROUP)

task2.doLast{
println 'task2'
}

Task参数Map可用配置

配置项 描述 默认值
type 基于一个存在的Task来创建,和我们类继承差不多 DefaultTask
overwrite 是否替换存在的Task,这个和type配合起来用 false
dependsOn 用于配置任务的依赖 []
action 添加到任务中的一个Action或者闭包 null
description 用于配置任务的描述 null
group 用于配置任务的分组 null

3、任务名字+闭包配置的方式:

task task3{
description 'task3'
doLast{
println 'task3'
println "任务描述:${description}"
}
}

Map配置的项有限,所以可以通过闭包的方式进行更加灵活的配置。闭包里的委托对象就是Task,所以你可以使用Task对象的任何方法,属性等信息。

TaskContainer创建任务的方式:

tasks.create("task4"){
description 'task4'
doLast{
println 'task4'
println "任务描述:${description}"
}
}

tasks是Project对象的属性,其类型是TaskContainer,可以用它来直接创建任务。

多种方式访问任务

创建的任务都会作为项目的一个属性,属性名就是任务名,所以可以直接通过任务名称来访问和操作任务:

task task5

task5.doLast{
println 'task5:doLast'
}

任务都是通过TaskContainer创建的,其实TaskContainer就是我们创建的集合。在Project中可以通过tasks属性访问TaskContainer,所以可以通过访问集合的方式来访问创建的任务:

task task6

tasks['task6'].doLast{
println 'task6:doLast'
}

通过路径来访问。访问方式有两种,一种是get,一种是find,区别在于get如果找不到任务会抛出UnKnownTaskException异常,而find在找不到任务时返回null。

task task7

tasks['task7'].doLast{
println tasks.findByPath(':Chapter4:task7')
println tasks.getByPath(':Chapter4:task7')
println tasks.findByPath('abc')
}

通过名称访问。方式也有两种:get和find,区别和路径方式相同:

task task8

tasks['task8'].doLast{
println tasks.findByName('task8')
println tasks.findByName('task8')
println tasks.findByName('abc')
}

通过路径访问的时候,参数值可以是任务路径,也可以是任务名字。而通过名称访问,参数只能是任务名称,不能是路径。

任务分组和描述

任务是可以分组和添加描述的。任务分组其实就是对任务分类,便于对任务归类整理。任务的描述就是说明任务有什么用,是任务的大概说明。

task task9{
group BasePlugin.BUILD_GROUP
description '构建任务'
doLast{
println 'task9:doLast'
}
}

<<操作符

在Gradle 5.1后已经废弃。

任务的执行分析

当我们执行一个任务的时候,其实就是执行其拥有的actions列表。这个列表保存在Task的对象实例中的actions成员变量中,其类型是List。

任务排序

通过任务的shouldRunAfter和mustRunAfter这两个方法,可以控制一个任务应该或者一定要在某个任务之后执行。

task task12{
doLast{
println 'task12'
}
} task task13{
doLast{
println 'task13'
}
} task12.mustRunAfter task13

任务的启用和禁用

Task中有个enabled属性,用于启用和禁用任务,默认为true,表示启用,设置为false,则禁止任务执行,输出会提示该任务被跳过。

task task14 {
doLast{
println 'task14'
}
} task14.enabled = false

任务的onlyIf断言

Task有一个onlyIf方法,它接受一个闭包作为参数,如果该闭包返回true,则该任务执行,否则跳过。

以打渠道包为例。首发应用宝和百度,直接编译会打出所有包,执行时间长,不符合需求,可以采用onlyIf来控制:

final String BUILD_APP = "build_app"
final String BUILD_APPS_ALL = "all"
final String BUILD_APPS_SHOUFA = "shoufa"
final String BUILD_APPS_EXCLUDE_SHOUFA = "exclude_shoufa" task(QQRelease).doLast{
println '打应用宝的包'
} task(BaiduRelease).doLast{
println '打百度的包'
} task(HuaWeiRelease).doLast{
println '打华为的包'
} task(MIUIRelease).doLast{
println '打MIUI的包'
} task build{
group BasePlugin.BUILD_GROUP
description "打渠道包"
} build.dependsOn QQRelease,BaiduRelease,HuaWeiRelease,MIUIRelease QQRelease.onlyIf{
def execute = false
if(project.hasProperty(BUILD_APP))
{
Object buildApp = project.property(BUILD_APP)
if(BUILD_APPS_SHOUFA.equals(buildApp)||BUILD_APPS_ALL.equals(buildApp))
{
execute = true
}
else{
execute = false
}
}
else{
execute = true
}
execute
} BaiduRelease.onlyIf{
def execute = false
if(project.hasProperty(BUILD_APP))
{
Object buildApp = project.property(BUILD_APP)
if(BUILD_APPS_SHOUFA.equals(buildApp)||BUILD_APPS_ALL.equals(buildApp))
{
execute = true
}
else{
execute = false
}
}
else{
execute = true
}
execute
} HuaWeiRelease.onlyIf{
def execute = false
if(project.hasProperty(BUILD_APP))
{
Object buildApp = project.property(BUILD_APP)
if(BUILD_APPS_EXCLUDE_SHOUFA.equals(buildApp)||BUILD_APPS_ALL.equals(buildApp))
{
execute = true
}
else{
execute = false
}
}
else{
execute = true
}
execute
} MIUIRelease.onlyIf{
def execute = false
if(project.hasProperty(BUILD_APP))
{
Object buildApp = project.property(BUILD_APP)
if(BUILD_APPS_EXCLUDE_SHOUFA.equals(buildApp)||BUILD_APPS_ALL.equals(buildApp))
{
execute = true
}
else{
execute = false
}
}
else{
execute = true
}
execute
}

执行方式如下:

#打所有渠道包
gradle build
gradle -Pbuild_app=all build
#打首发包
gradle -Pbuild_app=shoufa build
#打非首发包
gradle -Pbuild_app=exclude_shoufa build

命令行中-P意思是为Project指定K-V格式的属性键值对,格式为-PK=V。

任务规则

tasks.addRule("对规则的描述"){
String taskName->
task(taskName) {
println "${taskName}任务不存在"
}
} task task15{
dependsOn missTask
}

【Gradle】Gradle任务的更多相关文章

  1. Gradle | Gradle项目无法导入依赖包

    Gradle | Gradle项目无法导入依赖包 背景 今天使用idea导入一个Gradle项目,使用 gradle build构建成功,但是项目还是无法正常导入依赖包,显示错误如下: 解决方案 后来 ...

  2. build.gradle & gradle.properties

    一.build.gradle buildscript { ext { springBootVersion = '1.5.9.RELEASE' } repositories { maven { cred ...

  3. Gradle: Gradle Wrapper

    [Gradle 安装] 安装完毕后,记得设置一下环境变量.Environment Variables:GRADLE_HOME=D:\Program Files\Gadle\gradle-4.7Path ...

  4. [Gradle] Gradle 构建 android 应用常见问题解决指南

    转载地址:http://www.cnblogs.com/youxilua/p/3348162.html 1: 使用最新的gradle android插件 以前我们写的时候会这么写 dependenci ...

  5. [Gradle] Gradle 构建工具的未来

    转载地址:http://www.infoq.com/cn/news/2011/04/xxb-maven-6-gradle Maven面临的挑战 软件行业新旧交替的速度之快往往令人咂舌,不用多少时间,你 ...

  6. [Gradle] Gradle 简介

    Gradle 是以 Groovy 语言为基础,面向Java应用为主.基于DSL(领域特定语言)语法的自动化构建工具. Ø gradle对多工程的构建支持很出色,工程依赖是gradle的第一公民. Ø ...

  7. gradle/gradle plugin/Android studio关系

    gradle - 构建工具,存储于Users/stono/.gradle/wrapper/dists Adroid Studio- IDE Gradle plugin - 在AS中使用Gradle的插 ...

  8. Android Gradle 完整指南(转)

    本文转载来自:http://www.jianshu.com/p/9df3c3b6067a 为什么需要学Gradle? Gradle 是 Android 现在主流的编译工具,虽然在Gradle 出现之前 ...

  9. Gradle笔记系列(二)

    1.使用Gradle命令行 在这篇博客中,我们将简要介绍Gradle命令行的使用. 1.1 执行多任务 通过在命令行列出每个任务(task),你可以在一次构建(build)中执行多个任务.例如,命令g ...

  10. 解决gradle /Users/xxxx/Documents/workspace/fontmanager/.gradle/2.2.1/taskArtifacts/cache.properties (No such file or directory)报错办法

    git 上down下项目后,发现Android Studio报错: What went wrong: java.io.FileNotFoundException: /Users/raomengyang ...

随机推荐

  1. JS基础语法---函数作为返回值使用

    结论:函数是可以作为返回值使用的 function f1() { console.log("f1函数调用了"); return function() { console.log(& ...

  2. Linux是如何启动的?

    参考资料: An introduction to the Linux boot and startup processes 这篇随笔,可以理解为是对这篇英文文章的翻译与个人理解.笔记的整合. 扩展阅读 ...

  3. Linux CentOS 7 搭建 Tomcat 8 服务器

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一个初学者来说,可以这样 ...

  4. [C]struct结构化数据的一些要点

    1.用typedef声明一个短语代替冗长的struct成员声明 int main(void) { typedef struct Hores Hores; struct Hores { int age; ...

  5. SpringCloud 亿级流量 架构演进

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 前言 Crazy ...

  6. IT兄弟连 HTML5教程 DIV+CSS网页标准化布局 小结及习题

    小结 DIV+CSS布局页面的优势:表现和内容相分离.代码简洁,提高页面浏览速度.易于维护和改版.提高搜索引擎对网页的索引效率.每个HTML元素都可以看作一个区块,类似于装了东西的盒子,称为盒子模式. ...

  7. 【zabbix监控】zabbix监控tomcat服务

    服务器配置(zabbix_server) 1. 安装jdk 版本需要1.7以上,我这边安装的是1.8的,可以参考我jdk安装的文章 # 上传到zabbix_server服务端.安装(jdk-8u171 ...

  8. 计算机组成原理——I/O接口以及I/O设备数据传送控制方式

    接口可以看作是两个部件之间交接的部分.硬件与硬件之间有接口,硬件与软件之间有接口,软件与软件之间也有接口. 这里我们所说的I/O接口,一边连接着主机,一边连接着外设. I/O接口的功能 I/O接口的基 ...

  9. unity3D开发环境搭建

    前言 本文记录unity3D开发环境的搭建 unity安装 unity有中文官网(https://unity.cn/),很贴心,ide工具我们选择下载安装中国区增强版,下载地址:https://uni ...

  10. 从0使用Ruby on Rails打造企业级RESTful API项目实战之我的云音乐

    本节对我们项目实现的功能和知识点做一个简单的介绍,因为是RESTful API项目,所以对于后端来说基本上没有什么UI界面可展示,那我们就在关键的点,使用客户端(Android)实现的效果图. 课程简 ...