渐变文档描述了自定义渐变任务的@Nested
注释:https://docs.gradle.org/current/userguide/more_about_tasks.html#sec:task_input_output_annotations
不幸的是,就如何在build.gradle
文件中使用这一机制而言,还没有完整的例子。我创建了一个项目来演示每当gradle配置项目时发生的一个奇怪的异常:https://github.com/NicolasRouquette/gradle-nested-property-test
build.gradle有以下内容:
task T(type: NestedTest) {
tool = file('x')
metadata = {
a = "1"
}
}
NestedTest
自定义任务位于buildSrc
文件夹中:
class NestedTest extends DefaultTask {
@InputFile
public File tool
@Nested
@Input
public Metadata metadata
@TaskAction
def run() throws IOException {
// do something...
}
}
重要的一点是@Nested
属性,它的类型非常基本:
class Mlang-groovyetadata {
String a
}
当我执行以下操作时:./gradlew tasks
,我得到的是:
Build file '/opt/local/github.me/gradle-nested-property-test/build.gradle' line: 26
* What went wrong:
A problem occurred evaluating root project 'gradle-nested-property-test'.
> Cannot cast object 'build_6wy0cf8fn1e9nrlxf3vmxnl5z$_run_closure4$_closure5@2bde737' with class 'build_6wy0cf8fn1e9nrlxf3vmxnl5z$_run_closure4$_closure5' to class 'Metadata'
有人能解释一下正在发生的事情以及如何做到这一点吗?
- 尼古拉斯
@Nested
属性的语法需要调用build.gradle
文件中的类型构造函数。
也就是说,以下工作:
task T(type: NestedTest) {
tool = file('x')
metadata = new Metadata(
a: "1"
)
}