当前位置: 首页 > article >正文

gradle Task 详解

目录

Task定义和配置

Task的执行阶段

Task 的依赖

Task 指定执行顺序

Task 主gradle引入其他的gradle文件

将某一个task挂载到指定的task之后执行


gradle task官网:Task - Gradle DSL

Task定义和配置

查看工程下所有的task,使用如下命令

gradle tasks

定义一个task

task创建的源码

参数分别是 task 名称,和一个 closure。groovy语法的closure可以写在小括号外面,小括号可以省略

task的源码

public interface Task extends Comparable<Task>, ExtensionAware {
    String TASK_NAME = "name";
    String TASK_DESCRIPTION = "description";
    String TASK_GROUP = "group";
    String TASK_TYPE = "type";
	// 指定当前task的依赖的其他task
    String TASK_DEPENDS_ON = "dependsOn";
	// 重写 task
    String TASK_OVERWRITE = "overwrite";
	// 配置 task 任务逻辑
    String TASK_ACTION = "action";
	// 构造参数
    String TASK_CONSTRUCTOR_ARGS = "constructorArgs";
}

语法

task 自定义task名称

示例

task mytask {
    println "hello task."
}

执行自定义task

./gradle mytask


定义task也可以使用上面源码中的 TaskContainer 方式创建一个task

示例

this.tasks.create('mytask2') {
    println "hello task2."
}

给 task 添加分组

示例

// 给 自定义task 添加group 和 desc
// 示例一
task mytask1(group: "testGroup", description: "is am a test") {
    println "hello task1."
}
// 示例二
task mytask2 {
    setGroup("testGroup")
    setDescription("is am a test")
}

 添加分组的 task,在idea gradle项中会放在一个新组中,没有分组的自定义task会放在 other 中


Task的执行阶段

关于gradle的阶段请查看:gradle生命周期

配置阶段

普通定义的task都是在配置阶段都会被执行。

执行阶段

执行阶段就是特意使用了 gradle xxx 的方式指定某一个task执行。taks才会执行。其他命令task不会执行。

执行阶段的task,在配置阶段不会被执行。只有task才能在执行阶段被执行。使用如下两个函数,让 task 在gradle 执行阶段执行

  • doFirst:在task之前添加逻辑 // 在 @TaskAction 前面执行
  • 注解:@TaskAction,使用该注解的自定义task类中的代码也会在执行阶段执行
    • doLast:在task之后添加逻辑,(<< 表示 doLast,但是在gradle5.0版本中被移除) // // 在 @TaskAction 后面执行

示例

// 示例一
task testTask(group: "testGroup", description: "is am a test") {
    doFirst {
        println "hello doFirst. " + group
    }

}
// 示例二
testTask.doLast {
    println "hello doLast. " + description
}

// 示例三  << 表示 doLast,在gradle 5.0版本中 << 符号被移除 
task testTask2 << {
    println "hello doLast."
}

Task 的依赖

有3个task,taskA、taskB、taskC,taskA依赖taskB、taskC

//task taskA(dependsOn:"taskB"){    // 一个依赖的写法
// 被依赖的task定义在当前task后面,dependsOn参数要使用字符串""的方式
//task taskA(dependsOn:["taskB", "taskC"]){   // 多个依赖的写法
//    doLast {
//        println "taskA"
//    }
//}

task taskB {
    doLast {
        println "taskB"
    }
}

task taskC {
    doLast {
        println "taskC"
    }
}

// 被依赖的task在当前task之前,dependsOn参数可以直接使用变量的方式
task taskA(dependsOn:taskB){
    doLast {
        println "taskA"
    }
}

// 或者使用这种方式
//taskA.dependsOn([taskB, taskC])

为task添加指定前缀的task依赖

task libA {
    doLast{
        println "libA"
    }
}

task libB {
    doLast {
        println "libB"
    }
}

// 被依赖的要定义在前面,不然找不到
task taskTest {
    dependsOn this.tasks.findAll { task ->
        return task.name.startsWith("lib")
    }
    doLast {
        println "taskTest = " + dependsOn
    }
}

Task 指定执行顺序

有3个task,taskA、taskB、taskC,让task按照 A、B、C的顺序依次执行

task taskA {
    doLast {
        println "taskA"
    }
}

task taskB {
    mustRunAfter taskA    // 可以使用数组参数
    doLast {
        println "taskB"
    }
}

task taskC {
    mustRunAfter taskB
    doLast {
        println "taskC"
    }
}

执行命令:gradle taskB taskC taskA 


Task 主gradle引入其他的gradle文件

有一个 a.gradle 文件,如果需要让该文件生效。需要在主gradle文件中引用a.gradle

语法

apply from: 文件路径

示例

apply from: this.rootProject.file("a.gradle")

将某一个task挂载到指定的task之后执行

例如:在 task build 执行完成之后,接着自动执行 task a

this.afterEvaluate { org.gradle.api.Project project ->
    // 找到 build task
    def buildTask = project.tasks.getByName('build')
    if (buildTask == null) {
        throw GradleException("build task is not found.")
    }
    // 执行 build task 之后的 taskA
    buildTask.finalizedBy "taskA"
}


task taskA {
    doLast {
        println "taskA"
    }
}


http://www.kler.cn/news/17000.html

相关文章:

  • 什么是Filter?
  • 工具及方法 - 安装播放器pot player
  • 大二一个学期学这么点内容,没有概念,只有实操
  • TCP的三次握手和四次挥手
  • 冲浪杂记——
  • Apollo 7.0——percception:rader源码剖析
  • win11本地安全机构保护已关闭怎么办?如何修复windows11本地安全机构保护已关闭?
  • ubuntu: ubuntu22.04安装redis数据库,并设置开机自启动
  • Redis底层设计与源码分析(一)__底层数据结构逻辑分析
  • 低代码,一招制敌,解决职场人的的办公难题
  • 【热门框架】Maven中聚合,继承指的是什么?有什么作用?
  • 刚转岗做项目经理,无从下手,怎么办?
  • 【硬件】嵌入式电子设计基础之分析电路
  • 视频转gif如何做?三步教你视频转gif制作
  • ClickHouse的资料
  • JetBrains 公布 WebStorm 2023.2 路线图
  • 软件测试技术(四)白盒测试
  • 五面阿里Java岗,从小公司到阿里的面经总结
  • Docker file镜像
  • C/C++内存泄露检查利器—valgrind
  • Linux - 第11节 - 网络基础(一)
  • Ubuntu 23.04 安装 Jupyter
  • Mysql·分库分表
  • 第三十二章 Unity Mecanim动画系统(上)
  • 业绩稳健增长,公牛集团新老业务如何实现齐头并进?
  • 有趣的地理题
  • 排序算法 - 插入排序
  • 流量挂机赚钱项目Traffmonetizer
  • 19. 资源的调度——Label 与 Selector
  • linux怎么防止手误执行了rm / -rf或者rm /* -rf命令?