Gradle Kotlin Dsl Build for a Kotlin Gradle Plugin,它依赖于同一项目中的 Groovy Class

Gradle Kotlin Dsl Build for a Kotlin Gradle Plugin, which depends on a Groovy Class in the same Project

我有一个用 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 Class。这在 Intellij 中工作正常。

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

所以我尝试了这个:

tasks.compileKotlin {
    dependsOn(tasks.compileGroovy)
}

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

我收到以下错误:

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

所以我尝试从编译中删除 compileJava 任务依赖性,但没有成功Groovy:

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

问题如上。基本上我不清楚如何删除 gradle

中的预配置任务依赖项

我真正需要的是 gradle groovy 构建为:

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

我认为这是等价的,虽然我认为它只是把 Java 打乱了,所以 Groovy/Kotlin/Java buildSrc 代码将不起作用...:[=​​12=]

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

而且我不确定以上是否适用于测试排序,如果它们具有意外的语言依赖排序