Gradle自定义任务指南 —— 释放构建脚本的无限可能
文章目录
- 🔍Gradle任务
- ⚙️ 自定义任务的5大核心配置项
- 1. 任务注册(Registering Tasks)
- 2. group & description
- 3. dependsOn
- 4. inputs & outputs
- 5. 类型化任务(Task Types)
- 任务常见配置
- 参数传递
- 方式1:通过项目属性(-P参数)
- 方式2:通过系统属性(-D参数)
- 方式3:使用@Option注解(高级)
- 设置默认参数
- 参数验证
- 描述信息配置
- 任务依赖配置
- 🛠️ 实用案例快速上手
- 案例1:最简单的Hello World
- 案例2:自动复制文件
- 案例3:动态任务与依赖
- 案例4:多环境打包
- 💡 最佳实践提示
- 🌟 总结
🔍Gradle任务
在Gradle中,任务(Task) 是构建过程的基本执行单元。比如编译代码、运行测试、打包JAR文件等操作,本质上都是由不同的任务完成的。
- 默认任务:由插件提供(如
Java插件
的compileJava
、jar
) - 自定义任务:用户根据需求编写的任务,用于自动化特定操作
// 设置默认执行的任务(当直接运行gradle命令时)
defaultTasks 'clean', 'build'
// 自定义任务
tasks.register('hello') {
doLast {
println "🎉 Hello, Gradle!"
}
}
⚙️ 自定义任务的5大核心配置项
1. 任务注册(Registering Tasks)
- 任务注册(Registering Tasks):使用 tasks.register() 替代旧版 task 关键字,延迟注册避免配置阶段过早执行
// ✅ 延迟配置:仅在任务实际执行时才会初始化 推荐方式
tasks.register('generateConfig') {
doFirst {
println "hello task bengin"
}
doLast {
println "生成环境配置文件:${project.environment}"
}
}
// 可以在后续代码中动态修改任务配置
generateConfig.configure {
description = "动态添加任务描述"
}
// ❌ 旧版方式(立即配置)
task hello {
doLast { println "Hello!" }
}
2. group & description
- 为任务添加分组和描述,使
gradle tasks
命令输出更友好task myTask { group = "custom" description = "这是一个示例任务" }
3. dependsOn
- 定义任务依赖关系,确保执行顺序
task taskA {
doLast { println '执行Task A' }
}
task taskB(dependsOn: taskA) {
doLast { println '执行Task B' }
}
4. inputs & outputs
- 标记任务的输入/输出,支持增量构建(仅当输入/输出变化时重新执行)
task processFiles {
inputs.files("src/data")
outputs.dir("build/processed")
doLast {
println "处理文件..."
}
}
5. 类型化任务(Task Types)
- 继承
DefaultTask
或现有任务类型,实现更复杂的逻辑class MyTask extends DefaultTask { @TaskAction void run() { println "执行自定义任务类型!" } } tasks.register('customTask', MyTask)
任务常见配置
参数传递
方式1:通过项目属性(-P参数)
- 命令行传递参数
./gradle deploy -P environment=prod
- 在任务中读取参数
tasks.register('deploy') {
doLast {
def env = findProperty('environment') ?: "dev"
println "部署到${env}环境"
}
}
方式2:通过系统属性(-D参数)
- 命令行传递参数
./gradle run -Dapp.version=1.0.0
- 在任务中读取参数
tasks.register('printVersion') {
doLast {
def version = System.getProperty('app.version') ?: "unknown"
println "应用版本:$version"
}
}
方式3:使用@Option注解(高级)
// 定义支持参数的任务类型
abstract class CustomTask extends DefaultTask {
@Option(option = "message", description = "设置输出信息")
abstract Property<String> getMessage()
@TaskAction
void run() {
println(message.getOrElse("默认消息"))
}
}
// 注册任务
tasks.register('customMessage', CustomTask)
// 命令行使用
// gradle customMessage --message="Hello from CLI"
设置默认参数
- 设置默认值:避免因参数缺失导致构建失败
def env = findProperty('env') ?: "dev"
参数验证
if (!['dev', 'test', 'prod'].contains(env)) {
throw new InvalidUserDataException("非法环境参数:${env}")
}
描述信息配置
tasks.register("helloTask") {
group="build"
description="hello Task"
println("获取到自定义参数: ${project.properties["test"]}")
}
- 设置默认任务,执行
gradle
命令即可执行
defaultTasks("hello")
任务依赖配置
- 让已经存在的任务来依赖任务或是直接为其添加额外的操作
tasks.named("build") { //根据名称进行查找
dependsOn("hello") //直接配置依赖
doLast { ... } //添加新的Action到列表中
}
tasks.build { //直接从tasks中获取,这仅限于插件提供的任务
dependsOn("hello")
}
- 创建Task的子类,来编写自定义的任务类型
// 继承 DefaultTask 类来创建自定义的 HelloTask 类,这个类必须要可继承,要么open要么直接抽象类
open class HelloTask : DefaultTask() {
private var name: String = ""
@TaskAction //添加@TaskAction注解来声明此函数为任务的Action
fun hello() {
println("${name}")
}
fun user(name: String) { //类中也可以具有其他的函数
this.name = name
}
}
tasks.register<HelloTask>("hello") { //使用register时指明自定义的任务类
user("yuanyou") //this是HelloTask类型,可以直接使用自定义的函数
}
🛠️ 实用案例快速上手
案例1:最简单的Hello World
task hello {
doLast {
println "🎉 Hello, Gradle!"
}
}
- 运行:
gradle hello
案例2:自动复制文件
task copyReports(type: Copy) {
from("reports") // 源目录
into("build/docs") // 目标目录
include("*.pdf") // 仅复制PDF文件
}
- 运行:
gradle copyReports
案例3:动态任务与依赖
3.times { index ->
tasks.register("task${index}") {
doLast {
println "执行任务 ${index}"
}
}
}
task runAll {
dependsOn tasks.findAll { it.name.startsWith("task") }
}
- 运行:
gradle runAll
,将依次执行task0、task1、task2
案例4:多环境打包
- 场景需求:根据参数生成不同环境(dev/test/prod)的配置文件
// 定义参数化任务
abstract class GenerateConfigTask extends DefaultTask {
@Input
abstract Property<String> getEnv()
@OutputDirectory
abstract DirectoryProperty getOutputDir()
GenerateConfigTask() {
outputDir.convention(project.layout.buildDirectory.dir("config"))
}
@TaskAction
void generate() {
def configFile = new File(outputDir.get().asFile, "app.properties")
configFile.text = """
environment=${env.get()}
api.url=api.${env.get()}.example.com
"""
println "配置文件已生成至:${outputDir.get()}"
}
}
// 注册任务
tasks.register('genConfig', GenerateConfigTask) {
env = "dev" // 默认环境
}
// 命令行调用示例
gradle genConfig --env=test
💡 最佳实践提示
- 始终添加
group
和description
:让团队更易理解任务用途 - 善用增量构建:通过
inputs/outputs
提升构建速度 - 避免任务耦合:每个任务应专注于单一职责
🌟 总结
- 通过自定义任务,可以将重复性操作(如文件处理、部署、生成文档等)自动化,让构建脚本真正成为项目的“瑞士军刀”。
- 阅读Gradle官方文档-Task详解
动手实践是掌握Gradle的关键! 🚀