Gradle包含构建中,如何从一个约定插件引入另一个?
Gradle包含构建中约定插件间依赖配置问题
问题背景
使用包含构建(将buildlogic作为独立包含构建)搭建多项目Gradle架构,已拆分出common、library、app三个约定插件子项目,希望在library和app插件中引入common插件的通用逻辑,但直接在插件脚本的plugins块中引用id("buildlogic-common")时,Gradle提示找不到该插件。
解决方案
核心问题是包含构建内部的插件子项目依赖关系未正确配置,需按以下步骤调整:
1. 配置buildlogic的settings.gradle.kts
确保所有插件子项目被Gradle识别:
// buildlogic/settings.gradle.kts include(":common", ":library", ":app")
2. 正确配置common插件项目
在common/build.gradle.kts中,将其声明为Gradle预编译脚本插件项目并注册插件ID:
plugins { `kotlin-dsl` // 支持Kotlin DSL编写插件 } gradlePlugin { plugins { create("commonPlugin") { id = "buildlogic-common" // 定义插件ID,与后续引用保持一致 implementationClass = "buildlogic.common.gradle.kts" // 指向预编译脚本文件路径 } } } repositories { gradlePluginPortal() mavenCentral() }
3. 在library/app插件项目中依赖common项目
在library/build.gradle.kts和app/build.gradle.kts中,添加对common项目的依赖,让Gradle能解析buildlogic-common插件:
plugins { `kotlin-dsl` } dependencies { // 依赖common插件项目,建立内部依赖关系 implementation(project(":common")) } gradlePlugin { plugins { create("libraryPlugin") { id = "buildlogic-library" // library插件的ID implementationClass = "buildlogic.library.gradle.kts" } } } repositories { gradlePluginPortal() mavenCentral() }
4. 在插件脚本中引用common插件
完成上述配置后,即可在buildlogic.library.gradle.kts中正常引用common插件:
plugins { id("buildlogic-common") } // 此处添加library插件的专属构建逻辑
主项目settings.gradle.kts补充配置
确保主构建能识别包含构建的插件:
// my-project/settings.gradle.kts includeBuild("buildlogic") { dependencySubstitution { substitute(module("buildlogic:common")).using(project(":common")) substitute(module("buildlogic:library")).using(project(":library")) substitute(module("buildlogic:app")).using(project(":app")) } } // 引入业务模块 include(":module-a", ":module-b")
关键说明
- 包含构建内部的插件子项目必须通过
implementation(project(":xxx"))建立依赖,Gradle才能关联插件ID与对应项目; - 每个插件项目都需通过
gradlePlugin块注册插件ID和实现类路径; - 所有插件项目需配置
kotlin-dsl插件和必要仓库,确保依赖可正常下载。
内容的提问来源于stack exchange,提问作者Ulrich Schuster
相关产品推荐
相关产品推荐

