首页 > 解决方案 > 是否可以在 Gradle 中创建双重继承的自定义任务?

问题描述

我正在使用一堆外部库开发 Gradle(Groovy,而不是 Kotlin)库,并且我们有一个案例,我们希望在我们的代码中实现双重继承,而不是外部库提供的自定义任务。(作为参考,该库具体是 MarkLogic DataHub,我们正在扩展 RunFlowTask,但我已经为这个示例做了一些概括。引入了一些限制,但我相当肯定它们都可以工作大约。)

我想要的是以下内容:

ClassA.gradle

class ClassA extends com.external.plugin.TaskA {}

B类.gradle

import com.fasterxml.jackson.databind.ObjectMapper

class ClassB extends ClassA {}

...对需要放置的位置没有任何限制,只要它有效。值得注意的是,我们有很多像 ClassA 这样的例子可以独立工作,我只需要再次扩展 ClassA。

我已经详细介绍了我为使其在下面工作而进行的一些尝试;任何关于我对他们中的任何一个做错的反馈都非常受欢迎,或者如果有任何关于构建事物的全新方式的建议,那也完全值得赞赏。

第一次尝试:

apply from: './ClassA'
apply from: './ClassB'

=> ClassB.gradle 中的“无法解析 ClassA 类”,鉴于我对 Gradle 编译工作原理的了解,这很有意义。我尝试替换class ClassB...只是println ClassB为了查看,并且打印没有问题。让我觉得 ClassA 需要提前编译,所以我很确定我在这里没有做错任何事情,它只是行不通。

第二次尝试:

buildSrc/src/main/groovy/ClassA.gradle 存在,同上。

buildSrc/build.gradle

import com.fasterxml.jackson.databind.ObjectMapper

buildscript {
    repositories { }
    dependencies {
        classpath fileTree(dir: '/path/to/dependencies', include: '*.jar') // includes jackson
    }
}

println ObjectMapper

有效,println但我得到:

/path/to/src/main/groovy/ClassA.groovy: 1: unable to resolve class com.fasterxml.jackson.databind.ObjectMapper
 @ line 1, column 1.
   import com.fasterxml.jackson.databind.ObjectMapper

buildscript...如果我将块复制到ClassA子模块中,或者如果我从ClassA子模块中删除导入,则同样的事情。我的问题是我在进口方面做错了什么?似乎这应该可以工作,并且导入应该可以正常工作,但事实并非如此。

第三次尝试:

在这里省略一些代码示例:我得到了非常接近复制buildSrcincludeBuild文件夹的所有内容,并且ClassA可以作为顶级项目中的 TaskReference 访问,但我不知道如何extend ClassA从那里实际操作。

gradle.includedBuild('subbuild').task(':ClassA')=> org.gradle.composite.internal.IncludedBuildTaskReference gradle.includedBuild('subbuild').task(':UPMCRunFlowTask').resolveTask()=>Task with path ':ClassA' not found in project ':subbuild'.

我的问题是有没有办法回到类引用,所以它实际上是可扩展的?我尝试深入研究建立一个include './subbuild'子项目并遇到了类似的问题。

欢迎任何帮助/建议 - 谢谢!

标签: gradlegroovymarklogicmarklogic-dhf

解决方案


答案是第二次尝试。在build.gradle中,它必须是:

repositories {}
dependencies {
    implementation fileTree(dir: '/path/to/deps', include: ['*.jar'])
}

...并且子文件中不需要任何内容​​。


推荐阅读