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

Gradle buildSrc模块详解:集中管理构建逻辑的利器

文章目录

  • buildSrc模块
  • 二 buildSrc的使命
  • 三 如何使用buildSrc
    • 1. 创建目录结构
    • 2. 配置buildSrc的构建脚本
    • 3. 编写共享逻辑
    • 4. 在模块中引用
  • 四 典型使用场景
    • 1. 统一依赖版本管理
      • 2. 自定义Gradle任务
    • 3. 封装通用插件
    • 4. 扩展Gradle API
  • 五 注意事项
  • 六 与复合构建(Composite Builds)的区别
  • 七 总结

buildSrc模块

  • buildSrc 是Gradle项目中一个特殊的目录,用于存放与构建过程相关的代码(如自定义任务、插件、依赖版本管理等)。该目录下的代码会被Gradle自动编译并添加到项目的构建脚本类路径中,从而实现构建逻辑的复用和集中管理

二 buildSrc的使命

1. 解决痛点

  • 重复配置:在多模块项目中,多个子模块的build.gradle可能包含相同的插件版本、依赖声明或自定义任务。
  • 维护困难:当需要修改公共配置时,需逐个文件调整,易出错。
  • 代码复用:无法直接在构建脚本中共享工具类或扩展逻辑。

2. 核心优势

  • 自动可见性buildSrc中的代码对所有模块的构建脚本直接可见,无需手动导入。
  • 触发重建:修改buildSrc中的代码会触发Gradle的增量编译,确保构建逻辑及时生效。
  • 代码结构化:支持使用Kotlin/Groovy/Java编写结构化代码,提升可维护性。

三 如何使用buildSrc

1. 创建目录结构

在这里插入图片描述
在项目根目录下创建buildSrc模块目录,结构如下:

project-root/
├── buildSrc/
│   ├── src/
│   │   ├── main/
│   │   │   ├── kotlin/   # 或 groovy/java
│   │   │   └── resources/
│   │   └── test/         # 可选测试代码
│   └── build.gradle.kts  # buildSrc自身的构建配置
├── app/
│   └── build.gradle.kts
└── settings.gradle.kts

2. 配置buildSrc的构建脚本

  • 编辑buildSrc/build.gradle.kts,声明依赖(如、Kotlin DSL):
// buildSrc/build.gradle.kts
plugins {`kotlin-dsl` // 启用Kotlin DSL支持
}repositories {mavenCentral()gradlePluginPortal() // 访问Gradle插件仓库
}dependencies {implementation("com.android.tools.build:gradle:8.2.0") // 示例:引入Android Gradle插件API
}

3. 编写共享逻辑

buildSrc/src/main/kotlin中定义公共代码,例如版本管理:

// buildSrc/src/main/kotlin/Dependencies.kt
object Versions {const val kotlin = "1.9.0"const val junit = "5.8.2"
}object Libs {const val junitJupiter = "org.junit.jupiter:junit-jupiter:${Versions.junit}"
}

4. 在模块中引用

  • 在子模块的build.gradle.kts中直接使用:
// app/build.gradle.kts
plugins {kotlin("jvm") version Versions.kotlin
}dependencies {testImplementation(Libs.junitJupiter)
}

四 典型使用场景

1. 统一依赖版本管理

  • 定义所有依赖的版本号和坐标,避免多模块版本不一致。
  • 示例:集中管理Android SDK版本、Kotlin版本等。

2. 自定义Gradle任务

编写可复用的任务逻辑:

// buildSrc/src/main/kotlin/Tasks.kt
tasks.register("helloWorld") {doLast {println("Hello from buildSrc!")}
}

3. 封装通用插件

  • 将重复的插件配置抽象为自定义插件:
// buildSrc/src/main/kotlin/JavaConventionPlugin.kt
class JavaConventionPlugin : Plugin<Project> {override fun apply(project: Project) {project.apply {plugin("java-library")plugin("checkstyle")}// 统一配置源码集、测试等}
}

4. 扩展Gradle API

  • 添加DSL扩展或工具类:
// buildSrc/src/main/kotlin/MyExtensions.kt
open class MyExtension(project: Project) {var enableFeature: Boolean = false
}project.extensions.create("myConfig", MyExtension::class.java, project)

五 注意事项

  1. 目录命名强制要求:必须命名为buildSrc,且位于项目根目录。若使用Kotlin,需通过kotlin-dsl插件启用支持。
  2. 构建缓存:修改buildSrc代码会触发项目整体重新编译,适合低频变更的配置。对高频修改的逻辑,考虑使用复合构建(Composite Builds)。
  3. 依赖限制buildSrc不能依赖项目其他模块的代码。避免在buildSrc中引入大型依赖(如Spring Framework),否则会拖慢构建速度。

六 与复合构建(Composite Builds)的区别

特性buildSrcComposite Builds
代码变更触发重建修改即触发全项目重建需手动执行构建或通过--include-build
作用范围仅当前项目可跨多个项目复用
适用场景项目内共享逻辑跨项目共享插件/构建逻辑

七 总结

使用buildSrc的核心价值

  • 自动化依赖管理:告别手动同步版本号
  • 提升可维护性:集中管理构建逻辑,减少重复代码
  • 增强扩展性:轻松实现自定义DSL、插件和任务

推荐使用场景

  • 中大型多模块项目
  • 需要统一配置或自定义插件
  • 团队协作时规范构建逻辑

建议

  1. 从简单的版本管理开始,逐步迁移公共配置到buildSrc
  2. 探索结合Version Catalogs(Gradle版本目录)实现更灵活的依赖管理
  3. 参考官方文档:Gradle Build Sources

相关文章:

Gradle buildSrc模块详解:集中管理构建逻辑的利器

文章目录 buildSrc模块二 buildSrc的使命三 如何使用buildSrc1. 创建目录结构2. 配置buildSrc的构建脚本3. 编写共享逻辑4. 在模块中引用 四 典型使用场景1. 统一依赖版本管理2. 自定义Gradle任务 3. 封装通用插件4. 扩展Gradle API 五 注意事项六 与复合构建&#xff08;Compo…...

六、深入了解DI

依赖注入是⼀个过程&#xff0c;是指IoC容器在创建Bean时,去提供运⾏时所依赖的资源&#xff0c;⽽资源指的就是对象. 在上⾯程序案例中&#xff0c;我们使⽤了 Autowired 这个注解&#xff0c;完成了依赖注⼊的操作. 简单来说,就是把对象取出来放到某个类的属性中。 关于依赖注…...

基于RAG构建Text2SQL的实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…...

【论文阅读】HumanPlus: Humanoid Shadowing and Imitation from Humans

作者&#xff1a;Zipeng Fu、Qingqing Zhao、Qi Wu、Gordon Wetstein、Chelsea Finn 项目共同负责人&#xff0c;斯坦福大学 项目网址&#xff1a;https://humanoid-ai.github.io 摘要 制造外形与人类相似的机器人的一个关键理由是&#xff0c;我们可以利用大量的人类数据进行…...

第25篇 基于ARM A9处理器用C语言实现中断<一>

Q&#xff1a;怎样理解基于ARM A9处理器用C语言实现中断的过程呢&#xff1f; A&#xff1a;同样以一段使用C语言实现中断的主程序为例介绍&#xff0c;和汇编语言实现中断一样这段代码也使用了定时器中断和按键中断。执行该主程序会在DE1-SoC的红色LED上显示流水灯&#xf…...

Spring WebSocket 与 STOMP 协议结合实现私聊私信功能

目录 后端pom.xmlConfig配置类Controller类DTO 前端安装相关依赖websocketService.js接口javascripthtmlCSS 效果展示简单测试连接&#xff1a; 报错解决方法1、vue3 使用SockJS报错 ReferenceError: global is not defined 功能补充拓展1. 安全性和身份验证2. 异常处理3. 消息…...

RabbitMQ5-死信队列

目录 死信的概念 死信的来源 死信实战 死信之TTl 死信之最大长度 死信之消息被拒 死信的概念 死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;一般来说&#xff0c;producer 将消息投递到 broker 或直接到queue 里了&#xff0c;consumer 从 queue 取出消息进…...

[JavaScript] 面向对象编程

JavaScript 是一种多范式语言&#xff0c;既支持函数式编程&#xff0c;也支持面向对象编程。在 ES6 引入 class 语法后&#xff0c;面向对象编程在 JavaScript 中变得更加易于理解和使用。以下将详细讲解 JavaScript 中的类&#xff08;class&#xff09;、构造函数&#xff0…...

Windows上通过Git Bash激活Anaconda

在Windows上配置完Anaconda后&#xff0c;普遍通过Anaconda Prompt激活虚拟环境并执行Python&#xff0c;如下图所示&#xff1a; 有时需要连续执行多个python脚本时&#xff0c;直接在Anaconda Prompt下可以通过在以下方式&#xff0c;即命令间通过&&连接&#xff0c;…...

XSLT 编辑 XML:深度解析与实际应用

XSLT 编辑 XML&#xff1a;深度解析与实际应用 引言 XML&#xff08;可扩展标记语言&#xff09;和XSLT&#xff08;可扩展样式表语言转换&#xff09;是处理和转换XML数据的重要工具。本文将深入探讨XSLT在编辑XML文档中的应用&#xff0c;包括其基本概念、语法结构、以及实…...

主机监控软件WGCLOUD使用指南 - 如何设置主题背景色

WGCLOUD运维监控系统&#xff0c;从v3.5.7版本开始支持设置不同的主题背景色&#xff0c;如下 更多主题查看说明 如何设置主题背景色 - WGCLOUD...

C语言教程——文件处理(2)

目录 前言 一、顺序读写函数&#xff08;续&#xff09; 1.1fprintf 1.2fscanf 1.3fwrite 1.4fread 二、流和标准流 2.1流 2.2标准流 2.3示例 三、sscanf和sprintf 3.1sprintf 3.2sscanf 四、文件的随机读写 4.1fseek 4.2ftell 4.3rewind 五、文件读取结束的…...

ios打包:uuid与udid

ios的uuid与udid混乱的网上信息 新人开发ios&#xff0c;发现uuid和udid在网上有很多帖子里是混淆的&#xff0c;比如百度下&#xff0c;就会说&#xff1a; 在iOS中使用UUID&#xff08;通用唯一识别码&#xff09;作为永久签名&#xff0c;通常是指生成一个唯一标识&#xf…...

Spring Boot应用中实现基于JWT的登录拦截器,以保证未登录用户无法访问指定的页面

目录 一、配置拦截器进行登录校验 1. 在config层设置拦截器 2. 实现LoginInterceptor拦截器 3. 创建JWT工具类 4. 在登录时创建JWT并存入Cookie 二、配置JWT依赖和环境 1. 添加JWT依赖 2. 配置JWT环境 本篇博客将为大家介绍了如何在Spring Boot应用中实现基于JWT的登录…...

.NET9增强OpenAPI规范,不再内置swagger

ASP.NETCore in .NET 9.0 OpenAPI官方文档ASP.NET Core API 应用中的 OpenAPI 支持概述 | Microsoft Learnhttps://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/openapi/overview?viewaspnetcore-9.0https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/ope…...

pytest自动化测试 - pytest夹具的基本概念

<< 返回目录 1 pytest自动化测试 - pytest夹具的基本概念 夹具可以为测试用例提供资源(测试数据)、执行预置条件、执行后置条件&#xff0c;夹具可以是函数、类或模块&#xff0c;使用pytest.fixture装饰器进行标记。 1.1 夹具的作用范围 夹具的作用范围&#xff1a; …...

hot100_234. 回文链表

给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;head …...

【超详细】ELK实现日志采集(日志文件、springboot服务项目)进行实时日志采集上报

本文章介绍&#xff0c;Logstash进行自动采集服务器日志文件&#xff0c;并手把手教你如何在springboot项目中配置logstash进行日志自动上报与日志自定义格式输出给logstash。kibana如何进行配置索引模式&#xff0c;可以在kibana中看到采集到的日志 日志流程 logfile-> l…...

谈谈对JavaScript 中的事件冒泡(Event Bubbling)和事件捕获(Event Capturing)的理解

JavaScript 中的事件冒泡&#xff08;Event Bubbling&#xff09;和事件捕获&#xff08;Event Capturing&#xff09;&#xff0c;是浏览器在处理事件时采用的两种机制&#xff0c;它们在事件的传播顺序上有显著区别。这两种机制帮助开发者在事件触发时&#xff0c;能够以不同…...

cherry USB 键盘分析

文章目录 cherry USB 键盘分析描述符结构设备描述符配置描述符集合配置描述符接口 1 描述符HID 描述符端点 IN 描述符接口 2 描述符HID 描述符端点 IN 描述符端点 OUT 描述符字符串描述符语言 ID (字符串索引为 0)厂商字符串(字符串索引为 1)产品字符串(字符串索引为 2)HID 报告…...

IPoIB(IP over InfiniBand)数据接收与发送机制详解

IPoIB&#xff08;IP over InfiniBand&#xff09;是一种在InfiniBand网络上实现IP协议的技术&#xff0c;它允许在InfiniBand网络上传输IP数据包。IPoIB通过将IP数据包封装在InfiniBand的数据包中&#xff0c;实现了在InfiniBand网络上的高效通信。本文将详细分析IPoIB如何接收…...

Spring Boot - 数据库集成04 - 集成Redis

Spring boot集成Redis 文章目录 Spring boot集成Redis一&#xff1a;redis基本集成1&#xff1a;RedisTemplate Jedis1.1&#xff1a;RedisTemplate1.2&#xff1a;实现案例1.2.1&#xff1a;依赖引入和属性配置1.2.2&#xff1a;redisConfig配置1.2.3&#xff1a;基础使用 2&…...

JAVAweb学习日记(八) 请数据库模型MySQL

一、MySQL数据模型 二、SQL语言 三、DDL 详细见SQL学习日记内容 四、DQL-条件查询 五、DQL-分组查询 聚合函数&#xff1a; 分组查询&#xff1a; 六、DQL-分组查询 七、分页查询 八、多表设计-一对多&一对一&多对多 一对多-外键&#xff1a; 一对一&#xff1a; 多…...

网易Android开发面试题200道及参考答案 (下)

说明原码、反码、补码的概念 原码:是一种简单的机器数表示法。对于有符号数,最高位为符号位,0 表示正数,1 表示负数,其余位表示数值的绝对值。比如,对于 8 位二进制数,+5 的原码是 00000101,-5 的原码是 10000101。原码的优点是直观,容易理解,但在进行加减法运算时,…...

16.知识图谱中的本体、实体、属性与关系:区别与联系

文章目录 1. 引言2. 知识图谱的基本概念2.1 本体&#xff08;Ontology&#xff09;2.2 实体&#xff08;Entity&#xff09;2.3 属性&#xff08;Attribute&#xff09;2.4 关系&#xff08;Relationship&#xff09; 3. 本体、实体、属性、关系的区别与联系3.1 区别3.2 联系 4…...

Scratch游戏作品 | 僵尸来袭——生存大战,保卫你的领地!

今天为大家推荐一款刺激十足的Scratch射击生存游戏——《僵尸来袭》&#xff01;在这个充满危机的世界里&#xff0c;僵尸不断向你袭来&#xff0c;利用你的战斗技能与策略道具生存下来&#xff0c;成为最后的幸存者&#xff01;✨ 源码现已在小虎鲸Scratch资源站免费下载&…...

C# 自定义随机字符串生成

目录 简介 调用方式&#xff1a; 详细说明 1.外层方法封装 2.定义字符组合 3.按长度生成 简介 随机字符串&#xff0c;包含数字&#xff0c;字母&#xff0c;特殊符号等&#xff0c;随机拼凑&#xff0c;长度可输入 为了生成效率&#xff0c;长度大于1024的&#xff0c…...

【C++探索之路】STL---string

走进C的世界&#xff0c;也意味着我们对编程世界的认知达到另一个维度&#xff0c;如果你学习过C语言&#xff0c;那你绝对会有不一般的收获&#xff0c;感受到C所带来的码云风暴~ ---------------------------------------begin--------------------------------------- 什么是…...

[LeetCode] 字符串 I — 344#反转字符串 | 541#反转字符串II | 54K替换数字

字符串 基础知识344# 反转字符串541# 反转字符串II54K 替换数字 基础知识 字符串的结尾&#xff1a;空终止字符00 char* name "hello"; // 字符串不可拓展&#xff08;由于是一个固定分配的内存块&#xff09;&#xff0c;有些地方必须加const char name2[5] {h,…...

使用 Docker 运行 Oracle Database 23ai Free 容器镜像并配置密码与数据持久化

使用 Docker 运行 Oracle Database 23ai Free 容器镜像并配置密码与数据持久化 前言环境准备运行 Oracle Database 23ai Free 容器基本命令参数说明示例 注意事项高级配置参数说明 总结 前言 Oracle Database 23ai Free 是 Oracle 提供的免费版数据库&#xff0c;基于 Oracle …...