首页 > 解决方案 > Gradle Kotlin Dsl 为 Kotlin Gradle 插件构建,它依赖于同一项目中的 Groovy 类

问题描述

我有一个用 Kotlin 实现的 Gradle 插件,它是用 gradle kotlin DSL 构建脚本构建的。这工作正常。构建脚本如下,位于项目的 buildSrc 目录下:

plugins {
    groovy
    `kotlin-dsl`
}

repositories {
    mavenLocal()
    mavenCentral()
    jcenter()

}


dependencies {
    testImplementation(gradleTestKit())
    implementation(kotlin("gradle-plugin"))
    implementation ("com.bmuschko:gradle-docker-plugin:6.1.3")
}

现在我想从 Kotlin 插件代码中调用同一 buildSrc 源树中的现有 Groovy 类。这在 Intellij 中运行良好。

但是当使用 gradle 构建时,我得到一个:Groovy 类的未解析参考类。查看构建,我看到首先执行 compileKotlin 任务。当我取消注释失败的引用时,我看到 groovyCompile 生成了正确的二进制文件。

所以我尝试了这个:

tasks.compileKotlin {
    dependsOn(tasks.compileGroovy)
}

当然这还不够好,但我试图让构建首先编译 Groovy 代码。

我收到以下错误:

Circular dependency between the following tasks:
:buildSrc:compileGroovy
\--- :buildSrc:compileJava
     \--- :buildSrc:compileKotlin
          \--- :buildSrc:compileGroovy (*)

所以我尝试从compileGroovy中删除compileJava任务依赖但没有成功:

tasks.compileGroovy {
    dependsOn.remove(tasks.compileJava)
}

一些问题如上。基本上我不清楚如何在 gradle 中删除预先配置的任务依赖项

我真正需要的是相当于 gradle groovy build 的东西:

compileGroovy.dependsOn = compileGroovy.taskDependencies.values - 'compileJava'
compileKotlin.dependsOn compileGroovy
compileKotlin.classpath += files(compileGroovy.destinationDir)
classes.dependsOn compileKotlin

Gradle Kotlin Dsl 看起来如何?还是有更好的方法来解决这个 Groovy / Kotlin 代码依赖问题?

版本信息:

------------------------------------------------------------
Gradle 5.2.1
------------------------------------------------------------

Build time:   2019-02-08 19:00:10 UTC
Revision:     f02764e074c32ee8851a4e1877dd1fea8ffb7183

Kotlin DSL:   1.1.3
Kotlin:       1.3.20
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM:          1.8.0_232 (AdoptOpenJDK 25.232-b09)
OS:           Mac OS X 10.15.3 x86_64

标签: kotlingroovygradle-plugingradle-kotlin-dsl

解决方案


我认为这是等效的,尽管我认为它只是将 Java 淘汰出局,因此 Groovy/Kotlin/Java buildSrc 代码将无法工作......:

tasks {
    val compileJava = named("compileJava", JavaCompile::class).get()
    val compileKotlin = named("compileKotlin", KotlinCompile::class).get()
    val compileGroovy = named("compileGroovy", GroovyCompile::class).get()
    val classes by getting

    compileGroovy.dependsOn.remove("compileJava")
    compileKotlin.setDependsOn(mutableListOf(compileGroovy))
    compileKotlin.classpath += files(compileGroovy.destinationDir)
    classes.setDependsOn(mutableListOf(compileKotlin))
}

这在 Gradle 6.1 中得到了极大的改进

https://docs.gradle.org/6.1/release-notes.html#defining-compilation-order-between-groovy,-scala-and-java

如果他们有意外的语言依赖排序,我不确定上述是否适用于测试排序


推荐阅读