从buildSrc迁移到build-logic后,根项目Gradle任务类不可见如何解决?
根项目访问build-logic任务类/注册专属约定插件解决方案
一、让根项目可见build-logic中的任务类
参照Now in Android的build-logic结构,按以下步骤配置即可让根项目引用到build-logic内的任务类:
- 存放任务类到指定目录
将下载本地化资源的任务类放在build-logic/convention/src/main/kotlin/下的自定义包路径中,比如com/yourcompany/buildlogic/tasks/LocalizationDownloadTask.kt。 - 配置复合构建关联
根项目的settings.gradle.kts中必须包含build-logic的复合构建配置,确保根项目能识别build-logic模块:includeBuild("build-logic") { dependencySubstitution { substitute(module("com.yourcompany.buildlogic:convention")).using(project(":convention")) } } - 根项目添加build-logic依赖
在根项目的build.gradle.kts中通过buildscript引入build-logic的convention模块依赖:
完成后即可在根项目中直接注册任务:buildscript { dependencies { classpath("com.yourcompany.buildlogic:convention") } }tasks.register<com.yourcompany.buildlogic.tasks.LocalizationDownloadTask>("downloadLocalization") { // 配置任务参数,比如指定各子模块的res/values输出目录 outputDirs.set(subprojects.map { it.layout.projectDirectory.dir("src/main/res/values") }) }
二、为根项目注册专属约定插件
更规范的方式是给根项目单独编写约定插件,避免在根项目脚本中直接写任务注册逻辑:
- 创建根项目插件类
在build-logic/convention/src/main/kotlin/下创建RootConventionPlugin.kt:class RootConventionPlugin : Plugin<Project> { override fun apply(target: Project) { // 校验仅根项目可应用该插件 check(target == target.rootProject) { "此插件仅允许应用于根项目" } // 注册本地化资源下载任务 target.tasks.register<LocalizationDownloadTask>("downloadLocalization") { // 配置任务逻辑,比如关联子模块输出目录 outputDirs.set(target.subprojects.map { it.layout.projectDirectory.dir("src/main/res/values") }) } } } // 扩展函数简化插件引用 fun Project.applyRootConvention() { apply<RootConventionPlugin>() } - 声明插件ID
在build-logic/convention/src/main/resources/META-INF/gradle-plugins/com.yourcompany.buildlogic.root-convention.properties中添加插件映射:implementation-class=com.yourcompany.buildlogic.RootConventionPlugin - 根项目应用插件
根项目的build.gradle.kts中直接应用该插件:plugins { id("com.yourcompany.buildlogic.root-convention") }
更新说明
build-logic是用于定义项目特定约定插件的目录,参考了Now in Android应用的示例结构。
内容的提问来源于stack exchange,提问作者wa1demar
相关产品推荐
相关产品推荐

