Gradle系列之认识Gradle任务 (2)

还可以通过路径访问的方式访问任务,通过路径访问任务有两个关键方法:findByPath 和 getByPath,区别在于前者找不到指定任务的时候会返回 null,后者找不到任务的时候会抛出 UnknowTaskException 异常,代码参考如下:

/** * 访问任务的第三种方式:使用路径访问任务 */ 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

使用路径访问任务的过程,参数写成路径访问不到具体的任务,可能是写法问题,希望在后面的学习中能够解决。

此外,还可以通过任务名称访问,方法主要是 findByName 和 getByName,区别和第三种访问方式一样, 代码参考如下:

/** * 访问任务的第四种方式:使用任务名称访问 */ task taskJ tasks['taskJ'].doLast{ println 'taskJ' println tasks.findByName('taskJ') println tasks.getByName('taskJ') }

上面学习了访问任务的四种方式,通过对 Gradle 访问任务的了解,在具体的项目构建上在结合上面访问任务的方式灵活使用。

任务分组和描述

对于任务分组及描述实际上在之前的文章已经提到过且配置过,这里再简单说明一下,任务分组和描述实际上就是对已经创建的任务配置分组和任务描述,如下面这样配置:

//任务分组与描述 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

从执行结果可以看出,如果配置了任务的相关属性,那么就可以访问到任务的所有信息了。

操作符

学习一个操作符 << ,之前的测试代码中为了测试都会调用 task.doLast() 方法,我们可以使用 << 操作符来代替 doLast 方法,也就是说 daLast() 方法可以这样写:

//<< 任务操作符 //简写方式,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>

从输出结果可以看到两种写法都输出了想要的结果,同时观察日志发现这种简写方式已经在 Gradle 5.0 开始已经被放弃,所以推荐搭建使用 doLast 的方式配置任务。

任务的执行分析

在 Gradle 任务执行过程中,我们可以通过 doFirst 和 doLast 在任务执行之前或执行之后进行任务相关配置,当我们执行一个任务的时候,实际上是在执行该 Task 所拥有的 action,可以通过 getActions() 方法获取所有可以执行的 action,下面自定义一个 Task 类型 CustomTask ,并使用注解 @TaskAction 标注方法 doSelf 表示 Task 本身要执行的方法,代码如下:

//任务执行流程分析 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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdfsw.html