【Gradle】Gradle任务
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任务的更多相关文章
- Gradle | Gradle项目无法导入依赖包
Gradle | Gradle项目无法导入依赖包 背景 今天使用idea导入一个Gradle项目,使用 gradle build构建成功,但是项目还是无法正常导入依赖包,显示错误如下: 解决方案 后来 ...
- build.gradle & gradle.properties
一.build.gradle buildscript { ext { springBootVersion = '1.5.9.RELEASE' } repositories { maven { cred ...
- Gradle: Gradle Wrapper
[Gradle 安装] 安装完毕后,记得设置一下环境变量.Environment Variables:GRADLE_HOME=D:\Program Files\Gadle\gradle-4.7Path ...
- [Gradle] Gradle 构建 android 应用常见问题解决指南
转载地址:http://www.cnblogs.com/youxilua/p/3348162.html 1: 使用最新的gradle android插件 以前我们写的时候会这么写 dependenci ...
- [Gradle] Gradle 构建工具的未来
转载地址:http://www.infoq.com/cn/news/2011/04/xxb-maven-6-gradle Maven面临的挑战 软件行业新旧交替的速度之快往往令人咂舌,不用多少时间,你 ...
- [Gradle] Gradle 简介
Gradle 是以 Groovy 语言为基础,面向Java应用为主.基于DSL(领域特定语言)语法的自动化构建工具. Ø gradle对多工程的构建支持很出色,工程依赖是gradle的第一公民. Ø ...
- gradle/gradle plugin/Android studio关系
gradle - 构建工具,存储于Users/stono/.gradle/wrapper/dists Adroid Studio- IDE Gradle plugin - 在AS中使用Gradle的插 ...
- Android Gradle 完整指南(转)
本文转载来自:http://www.jianshu.com/p/9df3c3b6067a 为什么需要学Gradle? Gradle 是 Android 现在主流的编译工具,虽然在Gradle 出现之前 ...
- Gradle笔记系列(二)
1.使用Gradle命令行 在这篇博客中,我们将简要介绍Gradle命令行的使用. 1.1 执行多任务 通过在命令行列出每个任务(task),你可以在一次构建(build)中执行多个任务.例如,命令g ...
- 解决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 ...
随机推荐
- 关于选用ccflow你所担心的问题都在这里为您解答
致ccflow客户 感谢大家ccbpm的认可,我们会一如既往的以踏实的技术来回应大家的支持. 针对大家疑问最多的几个问题,在这里我我为大家一一解答. 代码一直在更新,不稳定问题 版本控制我们做的差,是 ...
- docker学习笔记---基本命令
[root@docker ~]# docker Usage: docker [OPTIONS] COMMAND A self-sufficient runtime for containers Opt ...
- redlock算法及其问题
背景 redlock算法是为了解决什么问题呢? 在单redis实例实现分布式锁时,可能会出现线程A设置完锁后,master挂掉,slave提升为master,因为异步复制的特性,线程A设置的锁丢失了, ...
- ZKWeb网页框架3.0正式发布
3.0 更新的内容有 更新 .NET 框架 替换项目模版的 netcoreapp2.2 到 netcoreapp3.0 目前支持的 .NET 框架有: net461, netcoreapp2.0, n ...
- 从无到有通过IDEA搭建SpringBoot项目
本人第一次写博客希望记录当下,努力成为IT界中的清流,写的不好多多包涵. SpringBoot是由Pivotal团队在2013年开始研发.2014年4月发布第一个版本的全新开源的轻量级框架.它基于Sp ...
- 持续集成(CI):Jmeter+Ant+Jenkins定时构建
这里Jenkins的安装部署以及工程项目的整体配置不做赘述,其它博文已经说明,这里主要是赘述Ant的相关配置,build.xml文件配置以及项目中的部分配置 一.build.xml 在Ant的安装目录 ...
- 算法设计与分析——n后问题(回溯法+位运算)
一.问题描述 在n×n格的国际象棋上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 二.算法设计 解n后问题的回溯算法描述如下: #include ...
- C# List 根据对象属性去重的四种方法对比
测试代码: private void TestDistinct() { Task.Run(() => { //生成测试数据 DateTime dt = DateTime.Now; Random ...
- laravel开发大型电商网站之异常设计思路分析
令人讨厌的异常 提起异常,大家都很反感,当信心满满的写完一段代码,刷新页面发现上面写着大大的 Exception 是最心烦的时候了.模块给领导演示的时候,如果报了异常,也是最让人崩溃的时候了. 在一般 ...
- 完全卸载Android Studio(卸载得干干净净)
步骤其实很简单,一共三步,但是每一步都需要完成,步骤如下: 打开控制面板或腾讯软件管家等执行常规的卸载操作. 找到SDK的安装目录手动删除SDK. 进入“C:\Users\<你的用户名下> ...