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

Gradle Task 进阶:Task 依赖关系、输入输出、增量构建原理

Gradle Task 进阶:依赖关系、输入输出与增量构建

Gradle 的 Task 是构建过程的基本执行单元,理解 Task 的依赖关系、输入输出声明 和增量 增量构建原理对于对于优化构建性能至关重要。

一、Task 依赖关系

Task 之间的依赖关系定义了它们的执行顺序,Gradle 提供了多种方式来声明依赖:

1. 基本依赖声明

task taskA {doLast {println "Executing taskA"}
}task taskB {dependsOn taskAdoLast {println "Executing taskB"}
}

2. 动态依赖

// 依赖所有以"test"开头的任务
task integrationTest {dependsOn tasks.matching { task ->task.name.startsWith('test')}
}

3. 任务依赖规则

tasks.withType(JavaCompile).configureEach { task ->// 所有JavaCompile任务都依赖于checkStyle任务task.dependsOn checkStyle
}

4. 最终任务与mustRunAfter

task clean {doLast { /* 清理操作 */ }
}task build {doLast { /* 构建操作 */ }
}// 指定执行顺序,但不强制依赖
build.mustRunAfter clean

二、Task 输入输出

声明任务的输入输出是实现增量构建的基础,Gradle 通过跟踪这些值来判断任务是否需要重新执行。

1. 简单输入输出声明

task processResources {// 输入目录inputs.dir 'src/main/resources'// 输出目录outputs.dir 'build/resources'doLast {// 复制资源文件的逻辑copy {from 'src/main/resources'into 'build/resources'}}
}

2. 输入属性

task generateVersionFile {// 声明输入属性inputs.property('version', project.version)inputs.property('buildNumber', System.getenv('BUILD_NUMBER') ?: 'SNAPSHOT')// 输出文件outputs.file "$buildDir/version.txt"doLast {file("$buildDir/version.txt").text = """Version: ${project.version}Build Number: ${System.getenv('BUILD_NUMBER') ?: 'SNAPSHOT'}""".stripIndent()}
}

3. 嵌套输入

对于复杂对象作为输入,需要使用@Nested注解:

class Credentials {String usernameString password
}task deploy {inputs.property('serverUrl', 'https://example.com')inputs.nested(new Credentials(username: 'admin', password: 'secret'))doLast {// 部署逻辑}
}

三、增量构建原理

增量构建是 Gradle 性能优化的核心特性,其工作原理如下:

  1. 任务执行前:Gradle 检查任务的输入和输出

    • 计算所有输入的哈希值
    • 检查输出是否存在且未发生变化
  2. 判断逻辑

    • 如果输入输出都没有变化,任务会被标记为UP-TO-DATE,跳过执行
    • 如果输入发生变化或输出缺失/变化,任务会被执行
  3. 实现方式

    • Gradle 在.gradle/[version]/taskArtifacts目录中存储任务的输入哈希和输出元数据
    • 每次构建时对比当前输入哈希与存储的哈希值

增量构建示例

task compileCustom {// 源代码作为输入inputs.files fileTree('src').include('**/*.custom')// 编译结果作为输出outputs.dir "$buildDir/classes/custom"doLast {println "Compiling custom files..."// 编译逻辑}
}

src目录下的.custom文件没有变化时,再次运行会显示:

:compileCustom UP-TO-DATE

四、高级技巧

  1. 任务输出缓存:可以通过outputs.cacheIf { true }启用远程缓存
task heavyProcessing {inputs.files 'data'outputs.dir 'results'outputs.cacheIf { // 只有在CI环境才缓存输出System.getenv('CI') != null }doLast {// 耗时处理}
}
  1. 任务禁用与启用
task legacyTask {enabled = false // 默认禁用doLast { /* 遗留逻辑 */ }
}
  1. 任务规则:动态创建任务依赖
tasks.addRule("Pattern: compile<Language>") { String taskName ->if (taskName.startsWith("compile")) {task(taskName) {doLast {println "Compiling with ${taskName - 'compile'} compiler"}}}
}

理解这些概念可以帮助你编写更高效、更可靠的 Gradle 构建脚本,显著提升构建性能,特别是在大型项目中。


文章转载自:

http://2KHG8dIE.dmwck.cn
http://fPQoTmsQ.dmwck.cn
http://KbaFC93Z.dmwck.cn
http://XfZfWfRQ.dmwck.cn
http://iL8AR5cf.dmwck.cn
http://GC3qwyWp.dmwck.cn
http://y3MKaipb.dmwck.cn
http://7tMc9L3t.dmwck.cn
http://64zJusih.dmwck.cn
http://6KOgYc6n.dmwck.cn
http://oXivzEsO.dmwck.cn
http://SVJHBtXe.dmwck.cn
http://Q0OSSOq2.dmwck.cn
http://YYzWZDv5.dmwck.cn
http://ySRrwvoD.dmwck.cn
http://GJ28lcYN.dmwck.cn
http://Jj5EGXNm.dmwck.cn
http://7Ogvi3KV.dmwck.cn
http://Tp1yrDcs.dmwck.cn
http://w4QMgMbQ.dmwck.cn
http://IFyr3sq3.dmwck.cn
http://NTqjKaFH.dmwck.cn
http://G5qpcIaD.dmwck.cn
http://9gyaDjHr.dmwck.cn
http://zmMsn5LF.dmwck.cn
http://9UHWlhIh.dmwck.cn
http://VF3u62bE.dmwck.cn
http://5XS9cotR.dmwck.cn
http://2qc4dAJH.dmwck.cn
http://RD0R0vMr.dmwck.cn
http://www.dtcms.com/a/368419.html

相关文章:

  • 串口通信基础知识
  • webshell及冰蝎双击无法打开?
  • Doris 数据仓库例子
  • 从零构建企业级LLMOps平台:LMForge——支持多模型、可视化编排、知识库与安全审核的全栈解决方案
  • 如何根据Excel数据表生成多个合同、工作证、录取通知书等word文件?
  • Highcharts 数据源常见问题解析:连接方式、格式处理与性能优化指南
  • T06_RNN示例
  • 【Android】Room数据库的使用
  • CoolGuard风控系统配置评分卡、权重策略|QLExpress脚本
  • 【FastDDS】Layer Transport ( 02-Transport API )
  • 确保 SQL Server 备份安全有效的最佳实践
  • 盘点完今年CoRL最火的VLA论文,发现最强的机器人,竟是用“假数据”喂大的
  • 新闻丨重庆两江新区党工委副书记、管委会主任许宏球一行莅临华院计算考察指导
  • 基于YOLO目标检测模型的视频推理GUI工具
  • latex公式符号与字体
  • SQL Server事务隔离级别
  • SQL高效处理海量GPS轨迹数据:人员gps轨迹数据抽稀实战指南
  • 查询语言的进化:SQL之后,为什么是GQL?数据世界正在改变
  • 概念 | C标准库STL,C运行时库CRT
  • JAiRouter 配置文件重构纪实 ——基于单一职责原则的模块化拆分与内聚性提升
  • ZooKeeper架构深度解析:分布式协调服务的核心设计与实现
  • ResNet 迁移学习---加速深度学习模型训练
  • Django REST framework:SimpleRouter 使用指南
  • Vue3 频率范围输入失焦自动校验实现
  • 删除元素(不是删除而是覆盖)快慢指针 慢指针是覆盖位置,快指针找元素
  • 代码随想录算法训练营第三天| 链表理论基础 203.移除链表元素 707.设计链表 206.反转链表
  • 结合机器学习的Backtrader跨市场交易策略研究
  • 前端开发vscode插件 - live server
  • 码农的“必修课”:深度解析Rust的所有权系统(与C++内存模型对比)
  • 【Python基础】 17 Rust 与 Python 运算符对比学习笔记