《Gradle权威指南》--Gradle任务
No1:
多种方式创建任务
def Task ex41CreateTask1 = task(ex41CreateTask1)
ex41CreateTask1.doLast{
println "创建方法原型为:Task task(String name)throws InvalidUserDataException"
} def Task ex41CreateTask2 = task(ex41CreateTask2,group:BasePlugin.BUILD_GROUP)
ex41CreateTask2.doLast{
println "创建方法原型为:Task task(Map<String,?> args,String name)throws InvalidUserDataException"
println "任务分组:${ex41CreateTask2.group}"
} task ex41CreateTask3{
description '演示任务创建'
doLast{
println "创建方法原型为:Task task(String name,Closure configureClosure)"
println "任务描述:${description}"
}
} tasks.create('ex41CreateTask4'){
description '演示任务创建'
doLast{
println "创建方法原型为:Task create(String name,Closure configureClosure) thorws InvalidUserDataException"
println "任务描述:${description}"
}
}
结果

No2:
Task参数中Map的可用配置

No3:
多种方式访问任务
task ex42AccessTask1
ex42AccessTask1.doLast{
println 'ex42AccessTask1.doLast'
} task ex42AccessTask2
tasks['ex42AccessTask2'].doLast{
println 'ex42AccessTask2.doLast'
} task ex42AccessTask3
tasks['ex42AccessTask3'].doLast{
println tasks.findByPath(':example42:ex42AccessTask3')
//println tasks.getByPath(':example42:ex42AccessTask3')
println tasks.findByPath(':example42:asdfasdfasdf')
} task ex42AccessTask4
tasks['ex42AccessTask4'].doLast{
println tasks.findByName('ex42AccessTask4')
println tasks.getByName('ex42AccessTask4')
println tasks.findByName('asdfasdfasdf')
}
结果

注:
任务都是通过TaskContainer创建的,其实TaskContainer就是我们创建任务的集合,在Project中我们可以通过tasks属性访问TaskContainer,所以我们就可以以访问集合元素的方式访问我们创建的任务
通过路径或者名称访问都有两种方式,get或find。区别在于get的时候如果找不到该任务就会抛出UnknownTaskException异常,而find会返回null
通过路径访问的时候,参数值可以是任务路径也可以是任务的名字。但通过名字访问的时候,参数值只能是任务的名字不能为路径
No4:
任务分组和描述
def Task myTask = task ex43GroupTask
myTask.group = BasePlugin.BUILD_GROUP
myTask.description='这是一个构建的引导任务'
myTask.doLast{
println "group:${group},description:${description}"
}
通过gradlew tasks查看
No5:
<<代替了doLast
task(ex44DoLast)<<{
println "ex44DoLast"
}
task(ex44DoLast).doLast{
println "ex44DoLast"
}
No6:
doLast和leftShift源码比较
public Task doLast(final Closure action){
hasCustomActions = true;
if(action==null){
throw new InvalidUserDataException("Action must not be null!");
}
taskMutator.mutate("Task.doLast(Closure)",new Runnable(){
public void run(){
actions.add(convertClosureToAction(action))
}
});
return this;
}
public Task leftShift(final Closure action){
hasCustomActions = true;
if(action==null){
throw new InvalidUserDataException("Action must not be null!");
}
taskMutator.mutate("Task.leftShift(Closure)",new Runnable(){
public void run(){
actions.add(taskMutator.leftShift(convertClosureToAction(action)));
}
});
return this;
}
注:actions.add()是把我们配置的操作转换为Action放在actions这个List里,是直接放在List的末尾
No7:
执行一个Task的时候,其实就是执行其拥有的actions列表,这个列表保存在Task对象实例中的actions成员变量中,其类型是一个List:
private List<ContextAwareTaskAction> actions = new ArrayList<ContextAwareTaskAction>();
No8:
任务的执行分析
def Task myTask = task ex45CustomTask(type:CustomTask)
myTask.doFirst{
println 'Task执行之前执行in foFirst'
}
myTask.doLast{
println 'Task执行之后执行in doLast'
}
class CustomTask extends DefaultTask{
@TaskAction
def doSelf(){
println 'Task自己本身在执行in doSelf'
}
}
结果

注:TaskAction注解标注表示该方法就是Task本身执行要执行的方法
No9:
doFirst和doLast源码
public Task doFirst(final Closure action){
hasCustomActions = true;
if(action == null){
throw new InvalidUserDataException("Action must not be null!");
}
taskMutator.mutate("Task.doFirst(Closure)",new Runnable(){
public void run(){
actions.add(0,convertClosureToAction(action));
}
});
return this;
}
public Task doLast(final Closure action){
hasCustomActions = true;
if(action == null){
throw new InvalidUserDataException("Action must not be null!");
}
taskMutator.mutate("Task.doLast(Closure)",new Runnable(){
public void run(){
actions.add(convertClosureToAction(action));
}
});
return this;
}
doFirst永远都是在actions List第一位添加;doLast永远都是在actions List元素的最后面
No10:
任务排序
task ex46OrderTask1<<{
println 'ex46OrderTask1'
}
task ex46OrderTask2<<{
println 'ex46OrderTask2'
}
ex46OrderTask1.mustRunAfter ex46OrderTask2
结果

shouldRunAfter是应该而不是必须,所以有可能任务顺序并不会按预设的执行
mustRunAfter这个规则就比较严格
No11:
任务的启用和禁用
task ex47DisenabledTask<<{
println 'ex47DisenabledTask'
}
ex47DisenabledTask.enabled = false
结果

No12:
任务的onlyIf断言
final String BUILD_APPS_ALL="all";
final String BUILD_APPS_SHOUFA="shoufa";
final String BUILD_APPS_EXCLUDE_SHOUFA="exclude_shoufa"; task ex48QQRelease<<{
println "打应用宝的包"
} task ex48BaiduRelease<<{
println "打百度的包"
} task ex48HuaweiRelease<<{
println "打华为的包"
} task ex48MiuiRelease<<{
println "打MiUi的包"
} task build{
group BasePlugin.BUILD_GROUP
description "打渠道包"
} build.dependsOn ex48QQRelease,ex48BaiduRelease,ex48HuaweiRelease,ex48MiuiRelease ex48QQRelease.onlyIf{
def execute = false;
if(project.hasProperty("build_apps")){
Object buildApps = project.property("build_apps")
if(BUILD_APPS_SHOUFA.equals(buildApps) || BUILD_APPS_ALL.equals(buildApps)){
execute = true;
}else{
execute = false;
}
}else{
execute = true;
}
execute
} ex48BaiduRelease.onlyIf{
def execute = false;
if(project.hasProperty("build_apps")){
Object buildApps = project.property("build_apps")
if(BUILD_APPS_SHOUFA.equals(buildApps) || BUILD_APPS_ALL.equals(buildApps)){
execute = true;
}else{
execute = false;
}
}else{
execute = true;
}
execute
} ex48HuaweiRelease.onlyIf{
def execute = false;
if(project.hasProperty("build_apps")){
Object buildApps = project.property("build_apps")
if(BUILD_APPS_EXCLUDE_SHOUFA.equals(buildApps) || BUILD_APPS_ALL.equals(buildApps)){
execute = true;
}else{
execute = false;
}
}else{
execute = true;
}
execute
} ex48MiuiRelease.onlyIf{
def execute = false;
if(project.hasProperty("build_apps")){
Object buildApps = project.property("build_apps")
if(BUILD_APPS_EXCLUDE_SHOUFA.equals(buildApps) || BUILD_APPS_ALL.equals(buildApps)){
execute = true;
}else{
execute = false;
}
}else{
execute = true;
}
execute
}
结果

No13:
任务规则
tasks.addRule("对该规则的一个描述,便于调试、查看等"){
String taskName->task(taskName)<<{
println "该${taskName}任务不存在,请查证后再执行"
}
}
task ex49RuleTask{
dependsOn missTask
}
结果

注:我们可以使用规则制作成,当执行、依赖不存在的任务时,不会执行失败,而是打印提示信息,提示该任务不存在
《Gradle权威指南》--Gradle任务的更多相关文章
- 读书笔记--Android Gradle权威指南(下)
前言 最近看了一本书<Android Gradle 权威指南>,收获挺多,就想着来记录一些读书笔记,方便后续查阅. 本篇内容是基于上一篇:读书笔记--Android Gradle权威指南( ...
- 读书笔记--Android Gradle权威指南(上)
本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 最近看了一本书<Android Gradle 权威指南>,对于 Gradle 理解又更深了,但不想过段时间就又忘光了,所 ...
- 《gradle权威指南》--Gradle入门
No1: Window下搭建Gradle:添加GRADLE_HOME环境变量,然后把GRADLE_HOME\bin添加到PATH系统变量里保存即可.完成后打开CMD,运行gradle -v来验证 No ...
- 《Gradle权威指南》--Android Gradle NDK支持
No1: 在根项目下的local.properties文件中配置 sdk.dir=/home/frame/android/android-sdk ndk.dir=/home/frame/android ...
- 《Gradle权威指南》--Android Gradle测试
No1: Android既可以用传统的JUnit测试,也可以用Android的instrument测试. No2: 当我们运行测试的时候,androidTest SourceSet会被构建成一个可以安 ...
- 《Gradle权威指南》--Android Gradle多渠道构建
No1: Build Variant = Build Type + Product Flavor Build Variant:构建的产物 Build Type:构建的类型 Product Flavor ...
- 《Gradle权威指南》--Android Gradle多项目构建
No1: Android多项目设置 目录结构: MyProject/ setting.gradle app/ build.gradle libraries/ lib1/ build.gradle li ...
- 《Gradle权威指南》--Android Gradle高级自定义
No1: 指定共享库 <uses-library android:name="com.google.android.maps" android:required=" ...
- 《Gradle权威指南》--Android Gradle插件
No1: Android Gradle插件分类 App插件id:com.android.application Library插件id:com.android.library Test插件id:com ...
- 《Gradle权威指南》--Java Gradle插件
No1: dependencies{ compile group: 'com.squareup.okhttp3',name:'okhttp',version:'3.0.1' } //缩写 depend ...
随机推荐
- luogu P1052 过河
传送门 容易想到设\(f_i\)表示走到坐标\(i\)的最少走过的石子数 但是这题数据范围很大,,, 不过一次可以走的步数范围是1-10,石子个数最多100个,所以中间会有很多多出来的没石子的路,可以 ...
- pygame设置text和image共同显示
下面介绍一下如何用pygame将text文本和图片一起绑定到视图 部分重点用不同颜色做了标记,希望对大家有帮助 代码块: %%writefile tranformtouxiang2.py import ...
- Junit的Assert用法
package junit.framework; /** * A set of assert methods. Messages are only displayed when an assert f ...
- nginx反向代理实现前后端分离&跨域问题
1.代理和跨域 1.1 正向代理 1)用户希望代理服务器帮助其和要访问服务器之间实现通信,需要: a.用户IP报文的目的IP=代理服务器IP: b.用户报文端口号=代理服务器监听端口号: c.HTTP ...
- media属性
media=“screen”是什么意思?? media 属性规定目标 URL 是为什么类型的媒介/设备进行优化的. 该属性用于规定目标 URL 是为特殊设备(比如 iPhone).语音或打印媒介设计的 ...
- 二、Linear Regression 练习(转载)
转载链接:http://www.cnblogs.com/tornadomeet/archive/2013/03/15/2961660.html 前言 本文是多元线性回归的练习,这里练习的是最简单的二元 ...
- 【转】Oracle 11g安装图文攻略
一.Oracle 下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可. 路径名称中,最好不要出现中文,也不要出现空格等不规则字符. 二.Oracle安装 1. ...
- tomcat端口冲突,多个tomcat同时启动问题
一台PC机上安装了两个tomcat,需要同时启动,每个tomcat上跑一个程序,但是现在提示端口号冲突,需要手动更改. 需要修改/conf/server.xml四个地方: 1.<Server p ...
- Linux内核移植
实验步骤:(1)准备工作(2)修改顶层Makefile(3)修改falsh 分区(4)配置编译内核 下面以Linux2.6.30.4内核移植到gec2440为例: 一.准备工作:建立工作目录,下载内核 ...
- windows安装配置git和Tortoisegit
git github gitlab Tortoisegit 的概念自行百度 1. 安装git 2. 安装小乌龟:Tortoisegit 和中文包 3. 配置 4. 使用 参考: 目录 安装及配置 ...