Gradle包含构建:实现基于版本号的依赖替换
基于版本匹配的Gradle Included Build依赖替换方案
要实现仅当依赖版本与本地项目版本一致时才用included build替换,否则走默认仓库搜索的需求,无需修改子项目代码,只需在元仓库的settings.gradle.kts中通过自定义dependencySubstitution逻辑实现:
核心实现代码
// 定义所有要纳入的独立项目本地路径 val includedBuildPaths = listOf( "../your-lib-project-1", "../your-lib-project-2", "../your-app-project" ) includedBuildPaths.forEach { buildPath -> includeBuild(buildPath) { dependencySubstitution { // 获取当前纳入构建的所有本地项目 val localBuildProjects = this@includeBuild.projects // 拦截所有依赖请求,按需替换 all { if (requested is ModuleComponentSelector) { val reqSelector = requested as ModuleComponentSelector // 查找本地group和name匹配的项目 val matchingLocalProject = localBuildProjects.firstOrNull { it.group.toString() == reqSelector.group && it.name == reqSelector.module } if (matchingLocalProject != null) { val localVersion = matchingLocalProject.version.toString() // 仅当请求版本与本地项目版本完全一致时,才替换成本地项目 if (reqSelector.version == localVersion) { substitute(requested).using(matchingLocalProject) } } // 版本不匹配时不做替换,Gradle自动走mavenLocal/远程仓库拉取对应版本 } } } } }
逻辑说明
- 遍历纳入构建:先列出所有独立项目的本地路径,逐个通过
includeBuild纳入元仓库 - 拦截依赖请求:通过
all回调捕获所有依赖解析请求,判断请求是否为带版本的模块组件(ModuleComponentSelector) - 版本匹配判断:找到本地group和name匹配的项目后,对比请求版本与本地项目版本,仅在完全一致时触发替换
- 默认逻辑 fallback:版本不匹配时不干预,Gradle会自动使用配置的仓库(mavenLocal/远程)查找对应版本的工件
注意事项
- 确保各子项目的
version属性在自身构建脚本中正确配置,元仓库才能读取到准确的版本值 - 动态版本(如
1.0-SNAPSHOT)同样适用,只要依赖请求的版本字符串与本地项目版本完全一致就会触发替换 - 所有配置仅在元仓库的
settings.gradle.kts中完成,无需修改任何子项目代码
内容的提问来源于stack exchange,提问作者Quinteger
相关产品推荐
相关产品推荐

