是否可以在 Gradle 中创建双重继承的自定义任务?
Is it possible to make a doubly-inherited custom task in Gradle?
我正在使用一堆外部库开发一个 Gradle(Groovy,不是 Kotlin)库,我们有一个案例想在我们的代码中实现双重继承关闭外部库提供的自定义任务。 (作为参考,该库具体是 MarkLogic DataHub,我们正在扩展 RunFlowTask,但我对这个示例进行了一些概括。引入了一些限制,但我相当确定所有这些都可以工作左右。)
我想要的是:
ClassA.gradle
class ClassA extends com.external.plugin.TaskA {}
ClassB.gradle
import com.fasterxml.jackson.databind.ObjectMapper
class ClassB extends ClassA {}
...对需要的地方没有任何限制,只要它有效。值得注意的是,我们有一堆像 ClassA 这样可以独立工作的示例,我只需要再次扩展 ClassA。
我在下面详细介绍了我为使它起作用所做的一些尝试;非常欢迎任何关于我对其中任何一个做错的反馈,或者如果有任何关于构建东西的全新方法的建议,也非常感谢。
第一次尝试:
apply from: './ClassA'
apply from: './ClassB'
=>
'unable to resolve class ClassA' in ClassB.gradle,考虑到我对 Gradle 编译如何工作的了解,这就足够了。我尝试用 println ClassB
替换 class 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
子模块中删除导入,则同样如此。我的问题是 我的导入有什么问题吗? 看起来这应该有效,导入应该 有效 ,但是他们不是。
第三次尝试:
在这里保留一些代码示例:我得到的一切都非常接近于将 buildSrc
复制到 includeBuild
文件夹中,并且 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'.
我的问题是 有没有办法回溯到 class 参考所以它实际上是可扩展的? 我尝试深入研究设置 include './subbuild'
子项目和 运行 陷入类似的问题。
欢迎任何 help/advice - 谢谢!
答案是第二次尝试。在 build.gradle
中,它需要是:
repositories {}
dependencies {
implementation fileTree(dir: '/path/to/deps', include: ['*.jar'])
}
...子文件中不需要任何内容。
我正在使用一堆外部库开发一个 Gradle(Groovy,不是 Kotlin)库,我们有一个案例想在我们的代码中实现双重继承关闭外部库提供的自定义任务。 (作为参考,该库具体是 MarkLogic DataHub,我们正在扩展 RunFlowTask,但我对这个示例进行了一些概括。引入了一些限制,但我相当确定所有这些都可以工作左右。)
我想要的是:
ClassA.gradle
class ClassA extends com.external.plugin.TaskA {}
ClassB.gradle
import com.fasterxml.jackson.databind.ObjectMapper
class ClassB extends ClassA {}
...对需要的地方没有任何限制,只要它有效。值得注意的是,我们有一堆像 ClassA 这样可以独立工作的示例,我只需要再次扩展 ClassA。
我在下面详细介绍了我为使它起作用所做的一些尝试;非常欢迎任何关于我对其中任何一个做错的反馈,或者如果有任何关于构建东西的全新方法的建议,也非常感谢。
第一次尝试:
apply from: './ClassA'
apply from: './ClassB'
=>
'unable to resolve class ClassA' in ClassB.gradle,考虑到我对 Gradle 编译如何工作的了解,这就足够了。我尝试用 println ClassB
替换 class 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
子模块中删除导入,则同样如此。我的问题是 我的导入有什么问题吗? 看起来这应该有效,导入应该 有效 ,但是他们不是。
第三次尝试:
在这里保留一些代码示例:我得到的一切都非常接近于将 buildSrc
复制到 includeBuild
文件夹中,并且 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'.
我的问题是 有没有办法回溯到 class 参考所以它实际上是可扩展的? 我尝试深入研究设置 include './subbuild'
子项目和 运行 陷入类似的问题。
欢迎任何 help/advice - 谢谢!
答案是第二次尝试。在 build.gradle
中,它需要是:
repositories {}
dependencies {
implementation fileTree(dir: '/path/to/deps', include: ['*.jar'])
}
...子文件中不需要任何内容。