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

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…...

【Airsim 仿真】查找配置文件 settings json 的路径优先级

Airsim 查找配置文件 settings.json 的路径优先级 参考官方文档 Settings - AirSim 文件格式要求 settings.json 文件采用常规的 JSON 格式。在首次启动时&#xff0c;AirSim 会在用户的主文件夹中创建一个没有设置的 settings.json 文件&#xff08;待测试&#xff09;。为…...

【FreeRTOS 教程 四】队列创建与发布项目到队列

目录 一、FreeRTOS队列&#xff1a; &#xff08;1&#xff09;队列介绍&#xff1a; &#xff08;2&#xff09;用户模型说明&#xff1a; &#xff08;3&#xff09;阻塞队列&#xff1a; 二、队列管理 API&#xff1a; &#xff08;1&#xff09;uxQueueMessagesWaiti…...

STM32项目分享:智能厨房安全检测系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 PCB图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; STM32智能厨房安全检测系统 &#xff08;资料分…...

2025美赛数学建模MCM/ICM选题建议与分析,思路+模型+代码

2025美赛数学建模MCM/ICM选题建议与分析,思路模型代码&#xff0c;详细更新见文末名片 一、问题A&#xff1a;测试时间&#xff1a;楼梯的恒定磨损&#xff08;Archaeological Modeling&#xff09; 适合专业&#xff1a;考古学、历史学、数学、机械工程 难度&#xff1a;中等…...

高并发问题的多维度解决之道

‍‌​​‌‌​‌​‍‌​​​‌‌​​‍‌​​​‌​‌​‍‌​​‌​​‌​‍‌‌​​‌​‌​‍‌​‌​‌‌​​‍‌​‌​‌​​​‍‌​‌​‌​‌​‍‌​‌‌​​‌​‍‌​‌‌​​​​‍‌‌​​‌‌‌‌‍‌‌​​‌​‌‌‍‌​​​‌‌​​‍‌​​‌‌‌​​‍‌…...

Ubuntu环境 nginx 源码 编译安装

ubuntu 终端 使用 wget 下载源码 sudo wget http://nginx.org/download/nginx-1.24.0.tar.gz解压刚下载的源码压缩包 nginx-1.24.0.tar.gz sudo tar -zxvf nginx-1.24.0.tar.gz 解压完成 产生 nginx-1.24.0 目录 进入该目录 cd ./nginx-1.24.0 目录下有一个可执行文件 con…...

K8S中的数据存储之基本存储

基本存储类型 EmptyDir 描述&#xff1a;当 Pod 被调度到节点上时&#xff0c;Kubernetes 会为 Pod 创建一个空目录&#xff0c;所有在该 Pod 中的容器都可以访问这个目录。特点&#xff1a; 生命周期与 Pod 绑定&#xff0c;Pod 删除时&#xff0c;数据也会丢失。适用于临时…...

编码器和扩散模型

目录 摘要abstract1.自动编码器2.变分编码器&#xff08;VAE&#xff09;3.论文阅读3.1 介绍3.2 方法3.3 结论 4.总结参考文献 摘要 本周学习了自动编码器&#xff08;AE&#xff09;和变分自动编码器&#xff08;VAE&#xff09;的基本原理与实现&#xff0c;分析其在数据降维…...

PAT甲级-1024 Palindromic Number

题目 题目大意 一个非回文数&#xff0c;加上它的翻转数所得的和&#xff0c;进行k次&#xff0c;有可能会得到一个回文数。给出一个数n&#xff0c;限制相加次数为k次&#xff0c;如果小于k次就得到回文数&#xff0c;那么输出该回文数和相加的次数&#xff1b;如果进行k次还…...

FS8405 Release FS0B

复位场景&#xff1a;FS8405正常工作后&#xff0c;RSTB后期产生拉低复位信号。 1 故障与PGOOD、RSTB和FS0B引脚的联系 FS8405出现故障时&#xff0c;会对PGOOD、RSTB和FS0B引脚产生不同的影响&#xff0c;具体影响如下&#xff1a; 橙色标记&#xff0c;反应是不可配置的。…...

IGBT的损耗计算的学习【2025/1/24】

可以通过示波器实测IGBT电压电流波形&#xff0c;然后通过示波器的math功能将电压电流波形乘积后积分求损耗。 软开管&#xff1a;给了导通信号&#xff0c;但是电流并没有从此IGBT流过 IGBT&#xff08;绝缘栅双极晶体管&#xff09;的损耗主要分为 导通损耗 和 开关损耗 两部…...

Unity|小游戏复刻|见缝插针1(C#)

准备 创建Scenes场景&#xff0c;Scripts脚本&#xff0c;Prefabs预制体文件夹 修改背景颜色 选中Main Camera 找到背景 选择颜色&#xff0c;一种白中透黄的颜色 创建小球 将文件夹里的Circle拖入层级里 选中Circle&#xff0c;位置为左右居中&#xff0c;偏上&…...

No.1|Godot|俄罗斯方块复刻|棋盘和初始方块的设置

删掉基础图标新建assets、scenes、scripts文件夹 俄罗斯方块的每种方块都是由四个小方块组成的&#xff0c;很适合放在网格地图中 比如网格地图是宽10列&#xff0c;高20行 要实现网格的对齐和下落 Node2D节点 新建一个Node2D 添加2个TileMapLayer 一个命名为Board&…...

SSM框架探秘:Spring 整合 SpringMVC 框架

搭建和测试 SpringMVC 的开发环境&#xff1a; web.xml 元素顺序&#xff1a; 在 web.xml 中配置 DisPatcherServlet 前端控制器&#xff1a; <!-- 配置前端控制器 --> <servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>…...

2025.1.20——二、buuctf BUU UPLOAD COURSE 1 1 文件上传

题目来源&#xff1a;buuctf BUU UPLOAD COURSE 1 1 目录 一、打开靶机&#xff0c;查看信息 二、解题思路 step 1&#xff1a;上传一句话木马.php文件康康回显 step 2&#xff1a;蚁剑连接 三、小结 一、打开靶机&#xff0c;查看信息 这里提示到了文件会被上传到./uplo…...

【架构面试】三、高可用高性能架构设计

高可用高性能架构设计 面试要点引入&#xff1a;架构原理、分布式技术等是面试必考领域&#xff0c;高可用高性能需求考察频繁。面试常通过询问系统架构设计来考察能力&#xff0c;讲解架构设计过程就是证明系统高可用的过程&#xff0c;其中涉及SLA指标。SLA指标详解 定义与衡…...

11.渲染管线——光栅化阶段

光栅化阶段是渲染管线中的一个关键步骤&#xff0c;负责将3D模型转换成屏幕上的2D像素。用通俗易懂的方式来解释&#xff1a; 通俗解释&#xff1a;光栅化就像把3D模型“投影”到2D屏幕上 想象你是一个画家&#xff0c;正在把3D场景画到2D画布上&#xff1a; 3D模型到2D屏幕的…...

【数据分享】1929-2024年全球站点的逐月平均能见度(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff01;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2024年全球气象站点…...

二叉树的深度

二叉树深度的定义&#xff1a; 二叉树的深度&#xff08;高度&#xff09;是指从根节点到最远叶子节点的最长路径上的节点数。例如&#xff0c;一个只有根节点的二叉树&#xff0c;其深度为1&#xff1b;如果根节点有两个子节点&#xff0c;且每个子节点又分别有两个子节点&…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...