Gradle笔记 四 Gradle的核心 TASK(一)https://developer.aliyun.com/article/1391966
当然:我们也可以在定义任务的同时指定任务的属性,具体属性有:
在定义任务时也可以给任务分配属性:定义任务的时候可以直接指定任务属性,也可以给已有的任务动态分配属性:
//①.F是任务名,前面通过具名参数给map的属性赋值,以参数方式指定任务的属性信息 task(group: "onenewcode",description: "this is task B","F") //②.H是任务名,定义任务的同时,在内部直接指定属性信息 task("H") { group("onenewcode") description("this is the task H") } //③.Y是任务名,给已有的任务 在外部直接指定属性信息 task "y"{} y.group="onenewcode" clean.group("onenewcode") //案例:给已有的clean任务重新指定组信息 可以在 idea 中看到: 上面自定义的那几个任务和 gradle 自带的
clean 任务已经跑到:onenewcode 组了。
任务类型
前面我们定义的task 都是DefaultTask 类型的,如果要完成某些具体的操作完全需要我们自己去编写gradle 脚本,势必有些麻烦,那有没有一些现成的任务类型可以使用呢?有的,Gradle 官网给出了一些现成的任务类型帮助我们快速完成想要的任务,我们只需要在创建任务的时候,指定当前任务的类型即可,然后即可使用这种类型中的属性和API 方法了。
常见任务类型 | 该类型任务的作用 |
Delete | 删除文件或目录 |
Copy | 将文件复制到目标目录中。此任务还可以在复制时重命名和筛选文件。 |
CreateStartScripts | 创建启动脚本 |
Exec | 执行命令行进程 |
GenerateMavenPom | 生成 Maven 模块描述符(POM)文件。 |
GradleBuild | 执行 Gradle 构建 |
Jar | 组装 JAR 归档文件 |
JavaCompile | 编译 Java 源文件 |
Javadoc | 为 Java 类 生 成 HTML API 文 档 |
PublishToMavenRepository | 将 MavenPublication 发布到 mavenartifactrepostal。 |
Tar | 组装 TAR 存档文件 |
Test | 执行 JUnit (3.8.x、4.x 或 5.x)或 TestNG 测试。 |
Upload | 将 Configuration 的构件上传到一组存储库。 |
War | 组装 WAR 档案。 |
Zip | 组装 ZIP 归档文件。默认是压缩 ZIP 的内容。 |
拓展:自定义 Task 类型
def myTask=task MyDefinitionTask (type: CustomTask) myTask.doFirst(){ println "task 执行之前 执行的 doFirst方法" } myTask.doLast(){ println "task 执行之后 执行的 doLast方法" } class CustomTask extends DefaultTask { //@TaskAction表示Task本身要执行的方法@TaskAction def doSelf(){ println "Task 自身 在执行的in doSelf" } }
测试:gradle MyDefinitionTask
控制台输出:
任务的执行顺序
在 Gradle 中,有三种方式可以指定 Task 执行顺序:
1、dependsOn 强依赖方式
2、通过 Task 输入输出
3、通过 API 指定执行顺序
动态分配任务
gradle 的强大功能不仅仅用于定义任务的功能。例如,可以使用它在循环中注册同一类型的多个任务
times { counter -> tasks.register("task$counter") { doLast { println "I'm task number $counter" } } }
一旦注册了任务,就可以通过 API 访问它们。例如,您可以使用它在运行时动态地向任务添加依赖项。Ant 不允许这样的事情发生。
times { counter -> tasks.register("task$counter") { doLast { println "I'm task number $counter" } } } tasks.named('task0') { dependsOn('task2', 'task3') }
构建 4 个任务,但是任务 0 必须依赖于任务 2 和 3,那么代表任务 2 和 3 需要在任务 0 之前优先加载。具体测试如下:
任务的关闭与开启
每个任务都有一个 enabled 默认为的标志 true。将其设置为 false 阻止执行任何任务动作。禁用的任务将标记为“跳过”。
task disableMe { doLast { println 'This task is Executing...' } enabled(true)//直接设置任务开启,默认值为true } //disableMe.enabled = false //设置关闭任务
任务的超时
每个任务都有一个 timeout 可用于限制其执行时间的属性。当任务达到超时时,其任务执行线程将被中断。该任务将被标记为失败。终结器任务仍将运行。如果 --continue 使用,其他任务可以在此之后继续运行。不响应中断的任务无法超时。Gradle 的所有内置任务均会及时响应超时
task a() { doLast { Thread.sleep(1000) println "当前任务a执行了" } timeout = Duration.ofMillis(500) } task b() { doLast { println "当前任务b执行了" } }
在控制台使用: gradle a b 测试会发现执行a 的时候,由于a 执行超时,抛出异常,所以没有继续往下执行【b 也没执行】。然后在控制台使用: gradle a b –continue,测试会发现a 虽然执行失败,但是 b 还是执行了。
任务的查找
常用的任务查找方法有:
task onenewcode { doLast { println "让天下没有难学的技术:onenewcode" } } //根据任务名查找 tasks.findByName("onenewcode").doFirst({println "onenewcode校区1:北京 "}) tasks.getByName("onenewcode").doFirst({println "onenewcode校区2:深圳 "}) //根据任务路径查找【相对路径】 tasks.findByPath(":onenewcode").doFirst({println "onenewcode校区3:上海 "}) tasks.getByPath(":onenewcode").doFirst({println "onenewcode校区4:武汉 "})
执行task: gradle onenewcode,输出结果如下所示:
onenewcode校区4:武汉.... onenewcode校区3:上海.... onenewcode校区2:深圳.... onenewcode校区1:北京.... 让天下没有难学的技术:onenewcode
任务的规则
当我们执行、依赖一个不存在的任务时,Gradle 会执行失败,报错误信息。那我们能否对其进行改进,当执行一个不存在的任务时,不是报错而是打印提示信息呢?
task hello { doLast { println 'hello onenewcode的粉丝们' } } tasks.addRule("对该规则的一个描述,便于调试、查看等"){ String taskName -> task(taskName) { doLast { println "该${taskName}任务不存在,请查证后再执行" } } }
测试: 使用 gradle abc hello 进行测试,此时当 abc 任务不存在时,也不会报异常【不中断执行】而是提示自定义的规则信息,继续执行 hello 任务。此外,它还可以根据不同的规则动态创建需要的任务等情况。
任务的 onlyIf 断言
断言就是一个条件表达式。Task 有一个 onlyIf 方法。它接受一个闭包作为参数,如果该闭包返回 true 则该任务执行, 否则跳过。这有很多用途,比如控制程序哪些情况下打什么包,什么时候执行单元测试,什么情况下执行单元测试的时候不执行网络测试等。具体案例如下所示:
task hello { doLast { println 'hello onenewcode的粉丝们' } } hello.onlyIf { !project.hasProperty('fensi') }
测试:通过-P 为Project 添加fensi 属性
gradle hello -Pfensi
默认任务
Gradle 允许您定义一个或多个在没有指定其他任务时执行的默认任务。代码如下所示:
defaultTasks 'myClean', 'myRun' tasks.register('myClean'){ doLast { println 'Default Cleaning!' } } tasks.register('myRun') { doLast { println 'Default Running!' } } tasks.register('other') { doLast { println "I'm not a default task!" } }
测试及结果如下:
gradle -q Default Cleaning!
Default Running!