当前位置: 首页 > 知识库问答 >
问题:

一个Kotlin Gradle插件的Gradle Kotlin Dsl构建,它依赖于同一个项目中的一个Groovy类

房星光
2023-03-14

我有一个用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类的:unresolved引用类。查看构建,我发现首先执行了compileKotlin任务。当我取消注释失败的引用时,我看到groovyCompile生成了正确的二进制文件。

所以我试过这个:

tasks.compileKotlin {
    dependsOn(tasks.compileGroovy)
}

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

我得到了以下错误:

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

因此,我尝试从compileGroovy中删除CompileJavaTask依赖项,但没有成功:

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

这看起来像格雷德尔·科特林的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

共有1个答案

梁嘉祥
2023-03-14

我认为这是等价的,尽管我认为它只是将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-groovy、-scala和java之间的编译顺序

我不确定上面的工程测试排序如果他们有意外的语言依赖排序

 类似资料:
  • 我想创建一个自动应用其他插件(外部插件)的插件。这需要在调用“apply plugin”之前设置插件的buildscript依赖项。然而,我似乎无法在插件中添加buildscript依赖项,或者我得到:您无法更改未处于未解析状态的配置! 有解决办法吗? 我的示例(非工作)代码:

  • 本文向大家介绍gradle 依赖于另一个Gradle项目,包括了gradle 依赖于另一个Gradle项目的使用技巧和注意事项,需要的朋友参考一下 示例 对于多项目gradle构建,有时可能需要依赖构建中的另一个项目。为此,请在项目的依赖项中输入以下内容: ':OtherProject'从目录结构的根引用的项目gradle路径在哪里。 为了':OtherProject'在build.gradle文

  • 免责声明:我是使用Ant Ivy的新手 我有以下eclipse配置: 项目A取决于项目B和项目C 项目B依赖于项目C 每个项目都有自己的ivy.xml文件。 ProjectA有一个生成。xml文件,如下所示: 因此,运行这个build.xml会导致错误,说ProjectC无法编译,因为它缺少一个*。应该由ivy:resolve命令解析的jar文件。 我的问题是: < li >如何创建一个build

  • 首先,打开Android Studio并选择Create new Project,然后它会让你输入一个名字,你可以任意取一个名字,比如:Weather App。然后你需要输入公司域名。如果你不会真正发布这个app,这个字段就不是特别重要了,但是如果你有的话可以使用自己的域名。然后任意选择一个目录作为这个项目的保存地址。 下一步,它会让你选择最小的API版本。我们选择API 15,因为我们有一个库需

  • 我正在使用maven 3.1.1,我有以下问题 我有一个主项目(pom.xml),它将被编译为WAR文件。它有两个模块。 模块1有以下内容(请注意工件的版本) 模块2有以下内容(请注意工件的版本) 因此,我的项目依赖于同一个库的两个版本。问题是库版本2与版本1不向后兼容。所以,我不能只包括版本2。 我正在考虑修改模块1以使用库版本2,但这需要大量时间。因此,我正在寻找一种方法来包含库的两个版本。

  • 通常, 一个 Java 项目的依赖许多外部的 JAR 文件.为了在项目里引用这些 JAR 文件,你需要告诉 Gradle 去哪里找它们.在 Gradle 中,JAR 文件位于一个仓库中,这里的仓库类似于 MAVEN 的仓库,可以被用来提取依赖,或者放入依赖。 举个例子,我们将使用开放的 Maven 仓库: 例子 7.3. 加入 Maven 仓库 build.gradle repositories