为什么无法访问" dependsOn"和"描述"任务属性以同样的方式?

时间:2017-08-27 18:51:06

标签: gradle groovy

通过阅读Gradle文档,我发现descriptiondependsOn都是Task类的属性。 我们可以用不同的方式设置description属性:

task MyTask
MyTask.description("This is MyTask")
MyTask.description "This is MyTask"
MyTask.description = "This is MyTask"

但即使dependsOn也是属性,我们也只能:

task MyTask
task AnotherTask
MyTask.dependsOn(AnotherTask)
MyTask.dependsOn AnotherTask

因为无法使用:

MyTask.dependsOn = AnotherTask

错误是:

  

无法投射对象':AnotherTask''与班级   ' org.gradle.api.DefaultTask_Decorated' to class' java.lang.Iterable'

我无法理解在幕后做了什么样的演员。 它是仅涉及属性的=运算符的强制转换吗?

1 个答案:

答案 0 :(得分:2)

您仍然可以使用=运算符来"分配"值dependsOn属性,但您必须提供有效类型:

MyTask.dependsOn = [AnotherTask]

否则你会得到ClassCastException

> Cannot cast object 'task ':AnotherTask'' with class 'org.gradle.api.DefaultTask_Decorated' to class 'java.lang.Iterable'

Groovy myTask.x = ...与调用myTask.setX(...)方法

这是正确的行为 - 如果你看一下org.gradle.api.Task接口源代码,你会发现description不是一个字段,而是一对getter和setter方法:

@Internal
String getDescription()

void setDescription(String var1);

同样适用于dependsOn"属性":

@Internal
Set<Object> getDependsOn()

void setDependsOn(Iterable<?> var1)

在这种情况下,Groovy允许您像访问属性一样访问这两个方法,但它会将执行传递给这些方法。所以当你这样做时:

MyTask.description

您实际上是致电MyTask.getDescription()。当你这样做时:

MyTask.description = 'This is description'

您实际上是致电MyTask.setDescription('This is description')

MyTask.dependsOn()案例

还有一件值得一提的关于dependsOn案例的事情。正如我之前提到的org.gradle.api.Task界面包含Set<Object> getDependsOn()void setDependsOn(Iterable<?> var1)。但那还不是全部。还有一种方法:

Task dependsOn(Object... var1);

它期望varargs(类型Object的单个参数或Object[]的数组)。在这种情况下,您可以执行以下方法调用:

MyTask.dependsOn AnotherTask // -> equivalent of MyTask.dependsOn(AnotherTask)
MyTask.dependsOn([AnotherTask] as Object[]) 

但你不能打电话:

MyTask.dependsOn [AnotherTask]
MyTask.dependsOn [AnotherTask] as Object[] // -> equivalent of (MyTask.dependsOn [AnotherTask]) as Object[]

第一种情况不会起作用,因为您需要将集合显式地转换为Obejct[]数组。第二个也不会工作,因为必须将转换到Object[]应用于参数。在这种情况下跳过括号会导致编译器尝试将强制转换应用于方法的结果,并且我们从第一种情况开始使用ClassCastException

我希望它有所帮助。