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 {@TaskActionvoid 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()@TaskActionvoid 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注解来声明此函数为任务的Actionfun 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 {@Inputabstract Property<String> getEnv()@OutputDirectoryabstract DirectoryProperty getOutputDir()GenerateConfigTask() {outputDir.convention(project.layout.buildDirectory.dir("config"))}@TaskActionvoid 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.mzph.cn/news/893673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows11关闭系统更新详细操作步骤

文章目录 1.打开注册表2.修改注册表内容2.1 新建文件2.2 修改值 3.修改设置 1.打开注册表 winR输入regedit(如下图所示) 2.修改注册表内容 进HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 2.1 新建文件 右侧界面右键即可 2.2 修改值 重命名为如下…

matlab绘图——彩色螺旋图

代码生成的图形是一个动态的彩色螺旋&#xff0c;展示了如何利用极坐标和颜色映射创建视觉吸引力强的图形。该图形可以用于数据可视化、艺术创作或数学演示&#xff0c;展示了 MATLAB 在图形处理方面的强大能力。通过调整 theta 和 r 的范围&#xff0c;可以创建出不同形状和复…

啥是EPS?

文章目录 1. 什么是EPS?2. 主要构成3. EPS的设计如何符合功能安全?4. 代表性的厂家1. 什么是EPS? EPS(Electric Power Steering,电动助力转向系统)是一种利用电动机提供转向助力的系统,取代了传统的液压助力转向系统(HPS)。EPS通过传感器检测驾驶员的转向意图,并由电…

QT:控件属性及常用控件(3)-----输入类控件(正则表达式)

输入类控件既可以进行显示&#xff0c;也能让用户输入一些内容&#xff01; 文章目录 1.Line Edit1.1 用户输入个人信息1.2 基于正则表达式的文本限制1.3 验证两次输入的密码是否一致1.4 让输入的密码可以被查看 2.Text Edit2.1 输入和显示同步2.1 其他信号出发情况 3.ComboBox…

24_游戏启动逻辑梳理总结

首先这个项目从游戏根入口GameRoot.cs的初始化开始 分为 服务层初始化Svc.cs 与 业务系统层初始化Sys.cs 而服务层 分为 资源加载服务层ResSvc.cs 与 音乐播放服务层AudioSvc.cs 而在 资源加载服务层ResSvc.cs中 初始化了 名字的 配置文件 而音乐播放服务层AudioSvc.cs 暂时没…

【25考研】中科院软件考研复试难度分析!

中科院软件复试不需要上机&#xff01;且对专业综合能力要求较高&#xff01;提醒同学一定要认真复习&#xff01; 一、复试内容 二、参考书目 官方并未明确给出&#xff0c;建议同学参考初试书目&#xff1a; 1&#xff09;《数据结构&#xff08;C语言版&#xff09;》严蔚…

大华相机DH-IPC-HFW3237M支持的ONVIF协议

使用libONVIF C库。 先发现相机。 配置 lib目录 包含 编译提示缺的文件&#xff0c;到libonvif里面拷贝过来。 改UDP端口 代码 使用msvc 2022的向导生成空项目&#xff0c;从项目的main示例拷贝过来。 CameraOnvif.h #pragma once#include <QObject> #include &l…

16.好数python解法——2024年省赛蓝桥杯真题

问题描述 一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位…)上的数字是奇数,偶数位(十位、千位、十万位…)上的数字是偶数,我们就称之为“好数”。 给定一个正整数N,请计算从1到N一共有多少个好数。 输入格式 一个整数N。 输出格式 一个整数代表答案。 样例输入 1 …

Vue3.5 企业级管理系统实战(三):页面布局及样式处理 (Scss UnoCSS )

本章主要是关于整体页面布局及样式处理&#xff0c;在进行这一章代码前&#xff0c;先将前两章中的示例代码部分删除&#xff08;如Home.vue、About.vue、counter.ts、App.vue中引用等&#xff09; 1 整体页面布局 页面整体布局构成了产品的框架基础&#xff0c;通常涵盖主导…

SQL调优讨论

说明&#xff1a;狭义的SQL调优&#xff0c;指对慢SQL&#xff08;一般是Select语句&#xff0c;或包含Select的语句&#xff09;优化&#xff0c;在不改变查询结果的情况下提高SQL执行效率。广义上的SQL调优&#xff0c;指对某个慢查询优化&#xff0c;通过一些类操作提供查询…

Django基础之ORM

一.前言 上一节简单的讲了一下orm&#xff0c;主要还是做个了解&#xff0c;这一节将和大家介绍更加细致的orm&#xff0c;以及他们的用法&#xff0c;到最后再和大家说一下cookie和session&#xff0c;就结束了全部的django基础部分 二.orm的基本操作 1.settings.py&#x…

PageView组件的功能和用法

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了如何屏蔽事件关的内容,本章回中将介绍PageView Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍的PageView是指左右滑动或者上下滑动显示不同的页面&#xff0c;Flutter把它…

Flutter:自定义Tab切换,订单列表页tab,tab吸顶

1、自定义tab切换 view <Widget>[// 好评<Widget>[TDImage(assetUrl: assets/img/order4.png,width: 36.w,height: 36.w,),SizedBox(width: 10.w,),TextWidget.body(好评,size: 24.sp,color: controller.tabIndex 0 ? AppTheme.colorfff : AppTheme.color999,),]…

论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(一)

Understanding Diffusion Models: A Unified Perspective&#xff08;一&#xff09; 文章概括引言&#xff1a;生成模型背景&#xff1a;ELBO、VAE 和分层 VAE证据下界&#xff08;Evidence Lower Bound&#xff09;变分自编码器 &#xff08;Variational Autoencoders&#x…

QT6 + CMAKE编译OPENCV3.9

参考文档 [1] https://blog.csdn.net/rjkf_css/article/details/135676077 前提条件 配置好相关运行环境&#xff1a;QT6、OPENCV3.9的sources文件 OPENCV下载网页&#xff1a;https://opencv.org/releases/ QT6下载教程&#xff1a;https://blog.csdn.net/caoshangpa/article…

Zemax 非序列模式下的颜色检测器和颜色混合

在 Zemax 的非序列模式中&#xff0c;探测器用于捕获系统中射线的信息。可以使用各种类型的探测器来捕获光学系统性能的不同方面&#xff0c;例如矩形探测器&#xff0c;它存储撞击它的 NSC 源射线的能量数据。 另一种经常使用的探测器类型是 Detector Color&#xff0c;它是一…

金融级分布式数据库如何优化?PawSQL发布OceanBase专项调优指南

前言 OceanBase数据库作为国产自主可控的分布式数据库&#xff0c;在金融、电商、政务等领域得到广泛应用&#xff0c;优化OceanBase数据库的查询性能变得愈发重要。PawSQL为OceanBase数据库提供了全方位的SQL性能优化支持&#xff0c;助力用户充分发挥OceanBase数据库的性能潜…

uni-app 程序打包 Android apk、安卓夜神模拟器调试运行

1、打包思路 云端打包方案&#xff08;每天免费次数限制5&#xff0c;最简单&#xff0c;可以先打包尝试一下你的程序打包后是否能用&#xff09;&#xff1a; HBuilderX 发行App-Android云打包 选择Android、使用云端证书、快速安心打包本地打包&#xff1a; HBuilderX …

小利特惠源码/生活缴费/电话费/油卡燃气/等充值业务类源码附带承兑系统

全新首发小利特惠/生活缴费/电话费/油卡燃气/等充值业务类源码附带U商承兑系统 安装教程如下 图片:

MacOS安装Docker battery-historian

文章目录 需求安装battery-historian实测配置国内源相关文章 需求 分析Android电池耗电情况、唤醒、doze状态等都要用battery-historian&#xff0c; 在 MacOS 上安装 battery-historian&#xff0c;可以使用 Docker 进行安装runcare/battery-historian:latest。装完不需要做任…