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

Gradle 增量构建与构建缓存:自定义 Task 如何实现 “只构建变化内容”?

要实现自定义 Gradle Task 的“只构建变化内容”(即增量构建),核心是通过输入(Inputs)和输出(Outputs)的声明,让 Gradle 能够追踪任务的依赖和结果变化。结合构建缓存(Build Cache),还能实现跨机器/跨构建的结果复用。以下是具体实现步骤和原理:

一、核心原理:输入输出追踪

Gradle 增量构建的核心逻辑是:

  • 若 Task 的输入未发生变化,且输出未被修改或删除,则跳过该任务(UP-TO-DATE)。
  • 若输入变化或输出丢失,才重新执行任务。

因此,自定义 Task 需明确声明:

  • 输入(Inputs):影响任务结果的所有因素(如文件、参数、依赖等)。
  • 输出(Outputs):任务生成的所有结果(如文件、目录等)。

二、自定义 Task 实现增量构建

1. 基础实现(继承 DefaultTask)

自定义 Task 需继承 DefaultTask,并通过注解声明输入输出。

import org.gradle.api.DefaultTask
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.TaskAction// 自定义任务:将输入文本写入输出目录的文件
abstract class MyIncrementalTask extends DefaultTask {// 声明输入:文本内容(会影响输出结果)@Inputabstract Property<String> getInputText()// 声明输出:生成文件的目录(任务结果存放位置)@OutputDirectoryabstract DirectoryProperty getOutputDir()@TaskActionvoid execute() {// 任务逻辑:将输入文本写入输出目录的文件def outputFile = outputDir.file("result.txt").get().asFileoutputFile.parentFile.mkdirs()outputFile.text = inputText.get()println("执行任务:生成文件 ${outputFile.absolutePath}")}
}
2. 注册任务并配置

build.gradle 中注册任务并设置输入输出:

tasks.register('myTask', MyIncrementalTask) {inputText.set("Hello, Incremental Build!") // 设置输入文本outputDir.set(file("$buildDir/myOutput"))   // 设置输出目录
}
3. 验证增量效果
  • 首次执行 ./gradlew myTask:任务执行(输出“执行任务…”)。
  • 再次执行 ./gradlew myTask:输入未变,输出存在,任务标记为 UP-TO-DATE(跳过执行)。
  • 修改输入(如 inputText.set("新内容"))或删除输出目录:任务重新执行。

三、进阶:复杂输入输出声明

根据任务逻辑,需使用不同注解声明输入输出:

注解用途示例场景
@Input简单类型输入(字符串、数字、布尔等)配置参数、版本号
@InputFile单个输入文件依赖的源文件
@InputDirectory输入目录(包含多个文件)源文件目录
@InputFiles多个输入文件/目录(文件集合)分散的源文件集合
@OutputFile单个输出文件生成的单个目标文件
@OutputDirectory输出目录(包含多个文件)生成的目标文件目录
@Nested嵌套对象(对象内的字段需声明输入)复杂配置对象
示例:依赖文件的增量任务

若任务依赖某个文件的内容,需用 @InputFile 声明:

abstract class FileProcessingTask extends DefaultTask {// 输入文件(内容变化会触发任务重新执行)@InputFileabstract RegularFileProperty getSourceFile()// 输出文件@OutputFileabstract RegularFileProperty getDestFile()@TaskActionvoid process() {def content = sourceFile.get().asFile.textdestFile.get().asFile.text = content.toUpperCase() // 转换为大写}
}// 注册任务
tasks.register('processFile', FileProcessingTask) {sourceFile.set(file("src/data.txt"))destFile.set(file("$buildDir/processed.txt"))
}

四、启用构建缓存(跨构建复用)

通过构建缓存,可复用其他机器或之前构建的任务结果(无需重新执行)。

1. 全局启用构建缓存

settings.gradle 中配置:

buildCache {local {enabled = true // 启用本地缓存directory = file("$rootDir/.gradle/build-cache") // 缓存目录}// 可选:启用远程缓存(如S3、HTTP服务器)// remote(HttpBuildCache) {//     url = uri("http://example.com/cache")//     enabled = true// }
}
2. 允许任务参与缓存

在自定义 Task 中添加 @CacheableTask 注解:

import org.gradle.api.tasks.CacheableTask@CacheableTask // 标记任务可缓存
abstract class MyIncrementalTask extends DefaultTask {// ... 输入输出声明同上 ...
}
3. 验证缓存效果
  • 首次执行任务:生成结果并写入缓存。
  • 清除输出目录(rm -rf build)后再次执行:Gradle 从缓存中恢复结果(输出 FROM-CACHE)。

五、注意事项

  1. 输入输出必须完整声明

    • 遗漏输入:Gradle 无法感知变化,可能导致旧结果被复用(错误)。
    • 遗漏输出:Gradle 可能误判任务未生成结果,重复执行。
  2. 避免动态输入

    • 输入应是可序列化的、可比较的(如避免使用 new Date() 作为输入,可改为固定版本号)。
  3. 目录输出的特殊性

    • @OutputDirectory 会追踪目录内所有文件的变化,删除文件也会触发任务重新执行。
  4. 嵌套对象处理

    • 若输入是自定义对象,需用 @Nested 注解,并在对象内部为字段声明 @Input 等注解。

通过以上方式,自定义 Task 可实现“只构建变化内容”,并利用构建缓存进一步提升效率。核心是让 Gradle 清晰掌握任务的输入输出依赖关系。

http://www.dtcms.com/a/524174.html

相关文章:

  • 【笑脸惹桃花】1024,阶段性回望与小结
  • 农产品网站建设策划方案网站获取qq号码 代码
  • 网站服务器的作用和功能有哪些福田欧辉是国企吗
  • R语言高效数据处理-变量批量统计检验
  • 云图-地基云图
  • R语言基于selenium模拟浏览器抓取ASCO数据-连载NO.03
  • 多分组火山图绘制-Rscript_version1.0
  • 【开题答辩全过程】以基于Hadoop的电商数据分析系统为例,包含答辩的问题和答案
  • 申威服务器安装Java11(swjdk-11u-9.ky10.sw_64.rpm)详细操作步骤(附安装包)
  • UVa 1596 Bug Hunt
  • 企业数据仓库
  • 如何用 HTML 生成 PC 端软件
  • Apache Spark算法开发指导-特征转换Normalizer
  • 泗洪网站建设变化型网页网站有哪些
  • 渭南哪家公司可以做网站小程序开发制作价格
  • 广州城市建设规划局网站我想给网站网站做代理
  • 蓝蜂 MQTT 网关打通 120 台设备数据,助汽车零部件厂降本 40%​
  • C++异常详细介绍
  • AKKO 3180键盘插到联想笔记本无法使用问题
  • 打造高清3D虚拟世界|零基础学习Unity HDRP高清渲染管线(第六天)
  • 从项目中学习CAN和CANFD报文结构(新手入门)
  • SpreadJS 赋能在线 Excel:协同编辑与精细化权限管控的技术实现
  • RabbitMQ 持久性详解
  • cms网站栏目介绍html免费模板下载
  • 太原网站建设培训班wordpress购买按钮插件
  • 北斗导航 | 接收机自主完好性监测(RAIM)在列车中的应用:原理、现状、挑战与案例
  • 前端Sass完全指南:从入门到精通
  • 网站建设地域名高校网站建设 网站群
  • 破局制造业数据孤岛,大腾智能PDM实现产研协同
  • 小程序文件在线显示(支持word,图片,视频等)