gradle自定义task的核心是继承defaulttask类并用@taskaction标注执行方法,需配合@input/@output声明实现增量构建,支持kotlin/groovy两种dsl注册与配置。

在 Gradle 中编写自定义 Task 是扩展构建流程最常用、最直接的方式。核心思路是:定义一个继承 DefaultTask(或实现 Task)的类,用 @TaskAction 标注执行逻辑,并在构建脚本中注册使用。
定义自定义 Task 类(推荐方式)
把任务逻辑封装为独立的类,便于复用、测试和维护。放在 buildSrc/src/main/groovy/(Groovy)或 buildSrc/src/main/kotlin/(Kotlin)下,Gradle 会自动编译并加入构建类路径。
- 以 Kotlin 为例(
buildSrc/src/main/kotlin/HelloTask.kt):
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
abstract class HelloTask : DefaultTask() {
@get:Input
abstract val name: Property<string>
@TaskAction
fun sayHello() {
println("Hello, ${name.get()}!")
}
}</string>
- 关键点:
@Input标记输入属性,支持增量构建;Property<t></t>是 Gradle 推荐的类型,比普通字段更安全、可配置化更强。
在 build.gradle(.kts) 中注册并配置任务
注册后即可像内置任务一样调用,支持 DSL 配置、依赖声明、分组等。
- Kotlin DSL(
build.gradle.kts):
tasks.register<hellotask>("sayHi") {
name.set("Gradle")
group = "custom"
description = "A simple custom task"
}</hellotask>
- 执行:
./gradlew sayHi→ 输出Hello, Gradle! - 可与其他任务建立依赖:
sayHi.dependsOn("classes") - 支持命令行参数传入:
./gradlew sayHi -Pname=World(需配合project.findProperty()或额外配置)
快速定义内联 Task(适合简单逻辑)
不写单独类,直接在构建脚本中用闭包或 lambda 定义,适合一次性、轻量逻辑。
- Groovy(
build.gradle):
tasks.register('printTime') {
doLast {
println "Build time: ${new Date()}"
}
}
- Kotlin DSL(
build.gradle.kts):
tasks.register("printTime") {
doLast {
println("Build time: ${java.time.LocalDateTime.now()}")
}
}
- 注意:
doFirst/doLast是对已有任务追加动作,适用于临时增强;而@TaskAction是自定义类的唯一执行入口。
进阶技巧:支持输入输出与增量构建
让自定义任务真正融入 Gradle 的增量构建体系,避免重复执行。
- 标注输入:
@Input(简单值)、@InputFile/@InputDirectory、@Classpath - 标注输出:
@OutputFile/@OutputDirectory - 示例片段:
@get:InputDirectory
abstract val inputDir: DirectoryProperty
@get:OutputDirectory
abstract val outputDir: DirectoryProperty
@TaskAction
fun processFiles() {
inputDir.get().asFile.walkTopDown()
.filter { it.name.endsWith(".txt") }
.forEach {
val out = outputDir.get().file(it.relativePath).asFile
out.parentFile.mkdirs()
out.writeText(it.readText().uppercase())
}
}
- 这样 Gradle 就能自动跳过未变更输入/输出的任务,大幅提升构建效率。











