当前位置: 首页 > 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;且每个子节点又分别有两个子节点&…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

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

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...