Gradle 7.2 自定义插件:如何在 apply(project: Project) 中使用版本目录?

问题描述 投票:0回答:3

我有一个运行正常的 Gradle 7.2 自定义插件。我想将其配置为使用新的 Gradle 版本目录来获取依赖信息。我知道如何配置和使用版本目录,并为我们的共享依赖项生成了一个共享 jar。它正在被其他一些版本读取,没有任何问题。

但是,我似乎找不到插件在设置依赖项时使用版本目录 jar 的正确咒语。我不断收到“‘VersionCatalogsExtension’类型的扩展不存在”。

以下两个片段显示了我在 apply 方法中访问版本目录所做的操作:

    override fun apply(project: Project) {
        val libs = project
           .extensions
           .getByType(VersionCatalogsExtension::class.java)
           .named("libs")
        
        addBuildDependencies(libs)
            .
            .
            .
private fun Project.addBuildDependencies(libs: VersionCatalog) {
    dependencies.apply {
        // BOMs
        add(JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME, platform(libs.findDependency("arrow.bom").get()))
        add(JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME, platform(libs.findDependency("detekt.bom").get()))

如果有任何片段或重定向,我将不胜感激。

谢谢, 迈克

gradle android-gradle-plugin build.gradle gradle-plugin gradle-kotlin-dsl
3个回答
0
投票

您如何应用该插件?

我注意到,如果您尝试从

allProjects
subprojects
块执行此操作,它不起作用,它会失败并出现以下错误:

Extension of type 'VersionCatalogsExtension' does not exist. Currently registered extension types: ...

我认为这与我们不能直接在这些块中使用

libs
的原因相同,请参阅此评论了解更多详细信息。

解决方案是直接在将使用它的项目中引用自定义插件并避免交叉配置。


0
投票

出现“

VersionCatalogsExtension
类型扩展不存在”的可能原因之一是应用插件的目标项目在其
settings.gradle
文件中没有所需的版本目录声明。即使您在环境中正确配置了所需的版本目录,也不意味着实际应用插件的环境中将存在相同的目录。

换句话说,分布式插件中不会包含任何版本目录,即使它们是在开发过程中在

settings.gradle
中声明的。这些版本目录绑定到特定的 Gradle buildscript 项目环境。

至少有 3 种可能的解决方案:

  1. 单独分发您的版本目录,并请求插件用户在其
    versionCatalogs { ... }
    配置中链接它(通过
    settings.gradle
    部分)。
  2. 最初建议这里

您可以拥有一个定义版本目录的设置插件,并告诉您的消费者应用该设置插件来获取相应的版本目录。

  1. 生成所需版本目录的代码(包装器)并将其包含到组件(Gradle 插件)中,这些组件将这些目录中的依赖项添加到目标项目。我写了一个项目(Gradle 插件)正是这样做的here。它不会发布到任何公共 Gradle 插件门户,但可以通过直接包含此项目来使用(通过复制代码或使用 Gradle 复合构建)。这是一个用法示例,里面
    build.gradle.kts
    :
plugins {
    id("org.jetbrains.kotlin.jvm")
    id("io.github.andrew-k-21-12.version-catalogs-generator")
    `java-gradle-plugin`
}

// Generating Kotlin sources for required version catalogs.
versionCatalogsGenerator {
    packageName.set("com.somepackage.versions")
    catalogs {
        register("KotlinVersionCatalog") {
            path.set("../dependencies/kotlin.toml")
        }
    }
}

kotlin {
    sourceSets {
        // Including the generated version catalogs into the sources.
        main.get().kotlin.srcDir(versionCatalogsGenerator.codeGenerationTask)
    }
}

gradlePlugin {
    plugins {
        create("your-plugin-declaration") {
            // ...
        }
    }
}

在插件代码中:

internal class SomePlugin : Plugin<Project> {

    override fun apply(target: Project) {
        val catalog = KotlinVersionCatalog()
        target.dependencies.add("implementation", catalog.libraries.commonsIo.fullNotation)
    }

}

-1
投票

请确保将此代码块添加到 settings.gradle.kts 文件中

enableFeaturePreview("VERSION_CATALOGS")
// == Define locations for components ==
dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
    versionCatalogs {
        create("libs") {
            from(files("PATH/libs.versions.toml"))
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.