You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义Kotlin Gradle插件中使用Version Catalog?Kover配置解析问题

1. 如何在自定义Kotlin Gradle插件中使用Version Catalog?

在编译型插件(Java/Kotlin类实现)中使用

  1. 先在插件项目的build.gradle.kts中添加Gradle版本目录API依赖:
dependencies {
    implementation(gradleApi())
    // 版本需与你项目使用的Gradle版本匹配
    implementation("org.gradle:gradle-version-catalog-api:7.4")
}
  1. 在插件实现类中通过Project对象获取Version Catalog并使用:
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.initialization.VersionCatalogsExtension

class CustomKotlinPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        val catalogsExtension = project.extensions.getByType(VersionCatalogsExtension::class.java)
        val libs = catalogsExtension.named("libs")

        // 应用插件
        project.plugins.apply(libs.findPlugin("kover").get().get().pluginId)
        
        // 添加依赖
        val okHttp = libs.findLibrary("okhttp").get()
        project.dependencies.add("implementation", okHttp)
    }
}

在预编译脚本插件(.gradle.kts文件)中使用

直接在脚本内通过扩展获取Version Catalog:

// custom-plugin.gradle.kts
val libs = extensions.getByType<VersionCatalogsExtension>().named("libs")

plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.kotlin.android)
}

// 后续配置逻辑...

2. 抽离Kover配置后解决"libs无法解析"的问题

方案一:在抽离的配置文件中直接获取Version Catalog

这是最直接的解决方式,不需要额外传递变量,在kover-config.gradle.kts中自行获取:

// kover-config.gradle.kts
val libs = extensions.getByType<VersionCatalogsExtension>().named("libs")

plugins {
    alias(libs.plugins.kover)
}

kover {
    merge {
        // 你的合并配置
    }
    reports {
        // 你的报告配置
    }
}

然后在根目录build.gradle.kts中直接应用:

apply(from = "kover-config.gradle.kts")

方案二:通过extra属性传递libs

如果需要显式传递,确保类型转换正确:

  1. 根目录build.gradle.kts中:
extra["libs"] = libs
apply(from = "kover-config.gradle.kts")
  1. kover-config.gradle.kts中:
import org.gradle.api.initialization.VersionCatalog

val libs = extra["libs"] as VersionCatalog

plugins {
    alias(libs.plugins.kover)
}

// Kover配置内容...

之前方法无效的原因

  • 直接传递map的apply(from, to)方式,to参数是指定配置应用的目标对象,并非传递自定义变量;
  • 扩展获取方式如果放在脚本错误的时机(比如插件块之前),可能导致扩展未初始化;
  • 类型转换错误也会导致无法解析libs。

内容的提问来源于stack exchange,提问作者muetzenflo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:34:57