kotlin - 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
解决方案
我认为这是等效的,尽管我认为它只是将 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 中得到了极大的改进
如果他们有意外的语言依赖排序,我不确定上述是否适用于测试排序
推荐阅读
- python - 为什么python列表显示切片异常?
- azure - Azure Synapse 外部表位置参数化
- android - android:layout_weight 仅适用于 LinearLayout 还是您也可以在 RelativeLayout 中使用它?
- azure - Azure Vnet 中的条件转发器不起作用
- html - 如何将特定元素添加到现有的 tumblr 主题?
- reactjs - 有没有办法在 createSlice 中访问全局状态?
- jquery - 为什么 window.location.href 消除了哈希值
- android - 使用 Android Intent 打开 Facebook 个人资料
- jquery - 在条件下禁用 Kendo Telerik UI 字体图标
- reactjs - 如何使用回调将数据从 React 组件中传递出去?