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

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插件compileJavajar
  • 自定义任务:用户根据需求编写的任务,用于自动化特定操作
// 设置默认执行的任务(当直接运行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

💡 最佳实践提示

  1. 始终添加groupdescription:让团队更易理解任务用途
  2. 善用增量构建:通过inputs/outputs提升构建速度
  3. 避免任务耦合:每个任务应专注于单一职责

🌟 总结

  • 通过自定义任务,可以将重复性操作(如文件处理、部署、生成文档等)自动化,让构建脚本真正成为项目的“瑞士军刀”。
  • 阅读Gradle官方文档-Task详解

动手实践是掌握Gradle的关键! 🚀


http://www.kler.cn/a/519643.html

相关文章:

  • BLE透传方案,IoT短距无线通信的“中坚力量”
  • 蓝桥杯例题三
  • Synology 群辉NAS安装(4)docker-compose
  • unity学习20:time相关基础 Time.time 和 Time.deltaTime
  • c语言中的数组(上)
  • Spring WebFlux
  • 解读2025年生物医药创新技术:展览会与论坛的重要性
  • 即梦(Dreamina)技术浅析(一)
  • 自动驾驶中的多传感器时间同步
  • 【自定义函数】编码-查询-匹配
  • python爬虫 爬取站长素材 (图片)(自学6)
  • Pyecharts之词云图、面积图与堆叠面积图
  • 一文讲解Java中的重载、重写及里氏替换原则
  • uniapp商城项目之商品详情
  • 在 Windows 系统上,将 Ubuntu 从 C 盘 迁移到 D 盘
  • 家政预约小程序10首先显示服务内容
  • 有关ORM
  • golang命令大全1--概述
  • Maven面试试题及其答案解析
  • 基础项目实战——学生管理系统(c++)
  • 【Elasticsearch】Springboot编写Elasticsearch的RestAPI
  • Vue 响应式渲染 - 模板语法
  • BroadCom-RDMA博通网卡如何进行驱动安装和设置使得对应网口具有RDMA功能以适配RDMA相机
  • 如何实现一个简单的中文错别字高亮系统?
  • 使用python-docx包进行多文件word文字、字符批量替换
  • 【数据分享】1929-2024年全球站点的逐日降水量数据(Shp\Excel格式)