
桌面应用网络【免费下载链接】ab-download-managerA Download Manager that speeds up your downloads项目地址https://gitcode.com/GitHub_Trending/ab/ab-download-manager点击查看免费下载本文基于 ab-download-manager 仓库中compositeBuilds/shared/README.md的核心思路展开讲解该项目的作者如何借助 Gradle Composite Build复合构建与模块坐标依赖实现同一份代码在buildSrc与主构建root project之间双向复用同时保留模块整体迁出到独立仓库的能力。读完本文你将掌握这一构建层复用模式的坐标写法、配置落点与实际源码佐证可直接套用到自己的多模块 Gradle 项目中。一、问题背景buildSrc 与主构建的代码孤岛在大型 Gradle 项目中buildSrc承担构建脚本与插件的定义职责而主构建root project负责业务模块的编译与打包。两者天然是两个相互独立的构建buildSrc中的代码无法被主构建的普通模块直接引用主构建模块中的代码也无法在buildSrc中被加载。ab-download-manager 的构建体系中恰好存在这种双向需求以 VersionUtil.kt 为例buildSrc在打包时需要判断当前操作系统Linux / macOS / Windows / Android来选择合适的TargetFormatDeb / Dmg / Msi 等这就需要一份平台检测代码与此同时主构建的普通模块如 shared/utils 等在做运行时平台判断时也需要同一份平台检测代码。如果两份代码分别维护极易产生行为漂移。该项目的解法正是在compositeBuilds/shared/README.md中阐述的核心模式把一个共享模块放进独立的 Composite Build让buildSrc与主构建同时以模块坐标依赖它。二、核心模式Composite Build 中的共享模块原文档指出compositeBuilds/shared是一个同时在buildSrc和主构建中使用的共享模块。其关键结论是向每个 composite 模块添加依赖时使用标准的模块坐标写法implementation($definedGroupId:$definedProjectName:$projectVersion)即group : 模块名 : version三段式坐标。这一写法看似与普通 Maven 坐标无异但在 Composite Build 场景下Gradle 会优先解析到本地参与复合构建的模块而不是从远程仓库拉取从而实现了本地共享、无发布依赖的效果。2.1 共享模块的自身定义compositeBuilds/shared/settings.gradle.kts给出了共享模块作为独立构建的完整定义通过dependencyResolutionManagement.versionCatalogs复用根目录的 gradle/libs.versions.toml 版本目录from(files(../../gradle/libs.versions.toml))保证依赖版本单一来源rootProject.name shared-code-between-gradle-and-app点名了该模块的设计初衷——在 Gradle 构建与应用之间共享代码include(platform)声明了内部的platform子模块。2.2 坐标三要素的实际取值以仓库中真实的platform模块为例坐标三要素在 compositeBuilds/shared/platform/build.gradle.kts 中均有明确赋值坐标段占位符实际值来源group$definedGroupIdir.amirab.utilplatform/build.gradle.kts 中的group声明模块名$definedProjectNameplatform该子模块的目录名version$projectVersion1platform/build.gradle.kts 中的version 1因此实际依赖坐标即为implementation(ir.amirab.util:platform:1)。三、两种消费方式buildSrc 与主构建原文档强调这一模式的两大收益仓库源码可以逐一印证。3.1 收益一buildSrc 与主构建可共享同一份代码在buildSrc侧消费buildSrc/build.gradle.kts 的dependencies块中除了引用一系列版本目录中的插件与semver库之外明确写入了implementation(ir.amirab.util:platform:1)这正是文档所述坐标写法的落地。buildSrc随即在 VersionUtil.kt 中直接调用Platform.getCurrentPlatform()来按操作系统推断打包格式private fun guessTargetFormatBasedOnCurrentOs() when (Platform.getCurrentPlatform()) { Platform.Desktop.Linux - TargetFormat.Deb Platform.Desktop.MacOS - TargetFormat.Dmg Platform.Desktop.Windows - TargetFormat.Msi Platform.Android - error(we are executing gradle in desktop :D) }同一份platform模块同时被主构建侧的 shared/utils 依赖。也就是说同一套平台识别逻辑被两个独立构建共同引用从根源上避免了双份实现的分叉。在主构建侧消费根 settings.gradle.kts 通过includeBuild将共享模块纳入复合构建并为其命名includeBuild(./compositeBuilds/shared) { name build-shared }includeBuild是 Composite Build 的入口——它告诉 Gradle请把compositeBuilds/shared当作本地构建参与依赖解析ir.amirab.util:platform:1这类坐标会优先命中本地模块。同理仓库还将 compositeBuilds/plugins内含git-version-plugin、installer-plugin等自定义插件一并纳入includeBuild构建层复用是该项目的一贯手法。3.2 收益二模块可无修改迁出为独立仓库这是该模式最值得借鉴的工程价值。因为共享模块本身就是一个自包含的独立 Gradle 构建有自己的settings.gradle.kts、build.gradle.kts它不依赖buildSrc的任何内部结构仅以相对路径../../gradle/libs.versions.toml引用根目录版本目录。一旦该模块迁往独立仓库只需把这一处版本目录引用改为指向新仓库自身的libs.versions.toml其余业务代码与构建脚本可原样保留消费方也只需把依赖解析从本地 includeBuild切换到远程仓库解析即可坐标形式完全不变。这正是原文档所说可以在不进行任何修改的情况下把这个模块移到独立仓库的技术基础。四、共享模块的代码实质以 platform 为例共享模块目前包含一个子模块platform其职责可以从源码结构中确认分文件位于 compositeBuilds/shared/platform/src/main/kotlin/ir/amirab/util/platform/Platform.kt用密封类描述Android与Desktop.Windows / Linux / MacOS通过System.getProperty(os.name)的lazy惰性探测得到当前平台并提供isWindows()、isLinux()、isMac()、isAndroid()等便捷判断Arch.kt描述x64、arm64、x32三种 CPU 架构支持把amd64、x86_64、aarch64等字符串归一化为标准架构名。这套代码既服务构建期如打包格式选择也可服务于运行期正是一份代码、两处消费的典型样本。五、模式要点小结环节操作仓库依据定义共享模块独立构建目录 settings.gradle.kts声明模块名与子模块compositeBuilds/shared/settings.gradle.kts声明坐标在子模块中设置group、version模块名取自目录名platform/build.gradle.kts接入主构建根settings.gradle.kts使用includeBuildsettings.gradle.kts供 buildSrc 使用buildSrc的dependencies中按group:name:version声明buildSrc/build.gradle.kts复用版本目录通过versionCatalogs指向根目录libs.versions.tomlgradle/libs.versions.toml这套模式的适用前提是共享代码本身足够通用、不依赖消费方内部 API并且共享模块与根项目之间要保持依赖关系的单向性才能保证未来整体迁出、零修改。对任何在buildSrc与业务模块之间反复复制工具类、平台检测代码的 Gradle 工程ab-download-manager 的compositeBuilds/shared都是一个值得直接借鉴的轻量级样板。赞分享桌面应用网络【免费下载链接】ab-download-managerA Download Manager that speeds up your downloads项目地址https://gitcode.com/GitHub_Trending/ab/ab-download-manager点击查看免费下载相关推荐Ktor 构建体系详解基于 Composite Build 的 build-logic 共享构建逻辑Ktor 构建体系详解基于 Composite Build 的 build logic 共享构建逻辑 本指南以 Ktor 仓库中的 build logic/R后端Web框架微服务如何使用Detekt提升ab-download-manager代码质量完整实践指南如何使用Detekt提升ab download manager代码质量完整实践指南 ab download manager是一款开源下载管理器旨在加速下载速桌面应用网络FACEGOOD-Audio2Face实战指南基于AiSpeech的智能对话与动画响应系统全解析 FACEGOOD Audio2Face实战指南基于AiSpeech的智能对话与动画响应系统全解析 想要实现数字人的智能对话和实时面部动画吗FACE人工智能深度学习预训练语音数字人上一篇投资数据时间序列分析Ghostfolio的Chart.js高级应用下一篇从零打造街霸AI用深度强化学习攻克格斗游戏终极Boss创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考