《Gradle权威指南》--Gradle任务
Posted 嘉禾世兴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《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任务的主要内容,如果未能解决你的问题,请参考以下文章
《Gradle权威指南》--自定义Android Gradle工程
《Gradle权威指南》--Android Gradle多渠道构建