我正在为一个多模块项目编写一些gradle插件。其中一些是引入任务,这应该被视为复制任务。他们当然会做文案,但也会做一些其他的事情。
我的问题比较普遍。我是否需要写一个自己的任务操作方法调用超级任务操作?还是gradle自动调用父类的任务操作?继续执行复制任务:
class MyCopyTask extends Copy {
public MyCopyTask () {
super()
from "just/a/default/path"
into "another/default/path"
}
@TaskAction
def myCopy() {
super.copy()
}
}
谁能给我解释一下gradle是如何决定在执行阶段执行哪些方法的?我是否需要方法"myCopy",为什么我需要它或不?
每个具体的任务类都需要有一个带@TaskAction
注释的方法,当任务被执行时,Gradle会调用这个方法。用@TaskAction
注释的超级方法将不会被调用。
子类化具体的任务类型,如Copy
,很少是必要的/合适的。而不是实现一个任务类型,如MyCopyTask
,考虑实现一个插件,添加一个Copy
类型的任务,或者一个任务类型,不继承Copy
,但调用project.copy()
在其任务操作(复合继承)。
除了@TaskAction
注释,自定义gradle类也继承了gradle注释。例如,如果您创建了一个定义输入的抽象任务,您可以在抽象类中使用@Input
注释这些输入,在类级别添加@CacheableTask
,然后任何扩展它的类将继承这些输入作为其缓存的一部分。
这也适用于接口,比如插件。