- 多种方式创建任务
- 多种方式访问任务
- 任务分组和描述
- 操作符
- 任务的执行分析
- 任务排序
- 任务的启用和禁用
- 任务的onlyIf断言
- 任务规则
多种方式创建任务
/**
* 第一种创建任务方式:
* 方法原型:Task task(String name) throws InvalidUserDataException;
*/
//定义Task变量接收task()方法创建的Task,方法配置创建的Task
def Task taskA = task(taskA)
//配置创建的Task
taskA.doFirst {
println "第一种创建任务的方式"
}
/**task
* 第二种创建任务方式:可在Map参数中进行相关配置,如依赖、任务描述、组别等
* 方法原型:Task task(Map<String,?> args,String name) throws InvalidUserDataException;
*/
def Task taskB = task(group: BasePlugin.BUILD_GROUP,taskB,description: "描述")
//配置创建的Task
taskB.doLast {
println "第二种创建任务的方式"
println "任务taskB分组:${taskB.group}"
println "任务taskB描述:${taskB.description}"
}
/**
* 第三种创建任务方式:通过闭包的方式创建Task,闭包里的委托对象就是Task,即可在闭包内调用Task
* 的一切属性和方法来进行Task的配置
* 方法原型:Task task(String name,Closure configureClosure);
*/
task taskC{
description 'taskC的描述'
group BasePlugin.BUILD_GROUP
doFirst{
println "第三种创建任务的方式"
println "任务taskC分组:${group}"
println "任务taskC描述:${description}"
}
}
/**
* 第四种创建任务的方式:可在闭包中灵活配置,也可在Map参数中配置,闭包中中的配置父覆盖Map中相同的配置
* 方法原型:Task task(Map<String,String name,Closure configureClosure);
*/
def Task taskD = task(group: BasePlugin.BUILD_GROUP,taskD,description: "描述"){
description 'taskD的描述'
group BasePlugin.UPLOAD_GROUP
doFirst{
println "第四种创建任务的方式"
println "任务taskD分组:${group}"
println "任务taskD描述:${description}"
}
}
type:基于一个已存在的Task来创建,类似于类的继承,默认值DefaultTask
overwrite:是否替换存在的Task,一般和type配合使用,默认值false
dependsOn:配置当前任务的依赖,默认值[]
action:添加到任务中的一个Action或者是一个闭包,默认值为null
description:任务描述,默认值null
group:任务分组,默认值null
//使用TaskContainer创建任务的方式
tasks.create("taskE"){
description 'taskE的描述'
group BasePlugin.BUILD_GROUP
doFirst{
println "第三种创建任务的方式"
println "任务taskE分组:${group}"
println "任务taskE描述:${description}"
}
}
多种方式访问任务
/**
* 访问任务的第一种方式:Task名称.doLast{}
*/
task taskF{
}
taskF.doLast{
println "第一种访问任务的方式"
}
/**
* 访问任务的第二种方式:使用TaskContainer访问任务
*/
task taskG{
}
tasks['taskG'].doLast {
println "第二种访问任务的方式"
}
/**
* 访问任务的第三种方式:使用路径访问任务
*/
task taskH{
println 'taskH'
//通过路径访问任务,参数可以是路径(没有访问成功,写法如下)
println tasks.findByPath(':GradleTask:taskG')
//通过路径访问任务,参数可以是任务名称
println tasks.findByPath('taskG')
println tasks.getByPath('taskG')
}
PS E:\Gradle\study\GradleTask> gradle taskH
> Configure project :
taskH
null
task ':taskG'
task ':taskG'
FAILURE: Build failed with an exception.
* Where:
Build file 'E:\Gradle\study\GradleTask\build.gradle' line: 98
* What went wrong:
A problem occurred evaluating root project 'GradleTask'.
> Task with path 'test' not found in root project 'GradleTask'.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
* Get more help at https://help.gradle.org
BUILD FAILED in 2s
/**
* 访问任务的第四种方式:使用任务名称访问
*/
task taskJ
tasks['taskJ'].doLast{
println 'taskJ'
println tasks.findByName('taskJ')
println tasks.getByName('taskJ')
}
任务分组和描述
//任务分组与描述
def Task task1 = task taskK
task1.group = BasePlugin.BUILD_GROUP
task1.description = '测试任务分组与描述'
task1.doLast {
println "taskK is group = ${group},description = ${description}"
}
PS E:\Gradle\study\GradleTask> gradle taskK
> Task :taskK
taskK is group = build,description = 测试任务分组与描述
BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed
操作符
//<< 任务操作符
//简写方式,Gradle 5.0 开始以不推荐这种写法
task taskL <<{
println "doLast"
}
//推荐写法
task taskL{
doLast{
println "doLast"
}
}
PS E:\Gradle\study\GradleTask> gradle taskL
> Configure project :
The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
at build_6syzx8ks0l09hby4j6yn247u9.run(E:\Gradle\study\GradleTask\build.gradle:123)
> Task :taskL
doLast
BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed
PS E:\Gradle\study\GradleTask> gradle taskL
> Task :taskL
doLast
BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed
PS E:\Gradle\study\GradleTask>
任务的执行分析
//任务执行流程分析
def Task taskA = task taskB(type: CustomTask)
taskA.doFirst {
println "Task执行之前调用:doFirst"
}
taskA.doLast {
println "Task执行之后调用:doLast"
}
class CustomTask extends DefaultTask{
@TaskAction
def doSelf(){
println "Task执行本身调用:doSelf"
}
}
PS E:\Gradle\study\GradleTask2> gradle taskB
> Task :taskB
Task执行之前调用:doFirst
Task执行本身调用:doSelf
Task执行之后调用:doLast
BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed
//创建任务的时候将使用@TaskAction标注的方法作为Task本身执行的Task
//此时,任务正在创建,actionList里面只有Task本身执行的Action
actionList.add(0,doSelfAction)
//任务创建完成之后,如果设置了doFirst则会在actionList最前面添加doFist对应的action
//此时,doFirst对应的action添加actionList的最前面,保证了doFirst方法在任务开始执行之前执行
actionList.add(0,doFirstAction)
//任务创建完成之后,如果设置了doLast则会在actionList最后面添加doLast对应的action,保证了doLast方法在任务开始执行之后执行
actionList.add(doLastAction)
任务排序
/**
* 任务顺序
* taskC.shouldRunAfter(taskD):表示taskC要在taskD的后面执行
* taskC.mustRunAfter(taskD):表示taskC必须要在taskD的后面执行
*/
task taskC {
doFirst{
println "taskC"
}
}
task taskD {
doFirst{
println "taskD"
}
}
taskC.shouldRunAfter(taskD)
PS E:\Gradle\study\GradleTask2> gradle taskC taskD
> Task :taskD
taskD
> Task :taskC
taskC
BUILD SUCCESSFUL in 2s
2 actionable tasks: 2 executed
任务的启用和禁用
taskA.enabled = true
任务的onlyIf断言
//任务的onlyIf断言
final String BUILD_ALL = 'all'
final String BUILD_FIRST = 'first'
final String BUILD_OTHERS = 'others'
task taskTencentRelease{
doLast{
println "打应用宝渠道包"
}
}
task taskBaiduRelease{
doLast{
println "打百度手机助手渠道包"
}
}
task taskMiuiRelease{
doLast{
println "打小米应用商店渠道包"
}
}
task buildTask{
group BasePlugin.BUILD_GROUP
description "打渠道包"
}
//为buildTask添加依赖的具体任务
buildTask.dependsOn taskTencentRelease,taskBaiduRelease,taskMiuiRelease
taskTencentRelease.onlyIf{
if (project.hasProperty("buildApp")){
Object buildApp = project.property("buildApp")
return BUILD_ALL == buildApp || BUILD_FIRST == buildApp
}else{
return true
}
}
taskBaiduRelease.onlyIf{
if (project.hasProperty("buildApp")){
Object buildApp = project.property("buildApp")
return BUILD_ALL == buildApp || BUILD_FIRST == buildApp
}else{
return true
}
}
taskMiuiRelease.onlyIf{
if (project.hasProperty("buildApp")){
Object buildApp = project.property("buildApp")
return BUILD_OTHERS == buildApp || BUILD_ALL == buildApp
}else{
return true
}
}
PS E:\Gradle\study\GradleTask2> gradle -PbuildApp=first buildTask
> Task :taskBaiduRelease
打百度手机助手渠道包
> Task :taskTencentRelease
打应用宝渠道包
BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 executed
PS E:\Gradle\study\GradleTask2> gradle -PbuildApp=others buildTask
> Task :taskMiuiRelease
打小米应用商店渠道包
BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed
PS E:\Gradle\study\GradleTask2> gradle -PbuildApp=all buildTask
> Task :taskBaiduRelease
打百度手机助手渠道包
> Task :taskMiuiRelease
打小米应用商店渠道包
> Task :taskTencentRelease
打应用宝渠道包
BUILD SUCCESSFUL in 1s
3 actionable tasks: 3 executed
//其中buildApp和=后面的值others是键值对的关系,使用命令执行任务时可使用-P命令简写
//-P要为当前Project指定K-V的属性键值对,即-PK=V
gradle -PbuildApp=others buildTask
任务规则
//任务规则
tasks.addRule("对该规则的一个描述"){
//在闭包中常常将->作为参数与代码块之间的分隔符
String taskName ->
task(taskName) {
doLast{
println "${taskName} 不存在"
}
}
}
task taskTest{
dependsOn taskX
}
PS E:\Gradle\study\GradleTask2> gradle taskTest
> Task :taskX
taskX 不存在
BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed