【Gradle】Gradle任务

个人博客:
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
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • 在 Android Studio 构建的项目中,基于 Gradle 进行项目的构建,同时使用 Android DS...
    Ant_way阅读 7,312评论 0 16
  • 目前为止,我们已经学习了如何修改Gradle构建属性,以及如何运行任务。本章,我们会深入了解这些属性,并且创建我们...
    sollian阅读 2,570评论 0 8
  • 项目和任务 Gradle中的所有内容都基于两个基本概念:项目和任务。 每个Gradle构建都由一个或多个项目组成。...
    小村医阅读 1,204评论 0 1
  • 上一章我们已经介绍了Gradle脚本的基础,在其中我们也强调了Gradle中最要的Projects和Tasks这两...
    acc8226阅读 1,961评论 4 4
  • https://www.jianshu.com/p/7c288a17cda8 总的来说,Android的系统体系结...
    燕京博士阅读 1,168评论 0 6