我正在尝试在多个Gradle任务中重用通用逻辑,类似于this answer中建议的那样,但是我无法看到额外的项目属性不可见。
归结起来,这就是问题所在。假设我有一个根Gradle构建脚本build.gradle
,它设置了一个额外的项目属性,
project.ext.myProp = 'myValue'
我在settings.gradle
,
include 'subproject'
并且子项目定义并使用引用该额外项目属性的自定义任务
class CustomTask extends DefaultTask {
CustomTask() {
doFirst {
println project.ext.myProp
}
}
}
task custom(type: CustomTask) {
println 'custom task'
}
执行此操作会给我这个:
FAILURE: Build failed with an exception.
...
* Exception is:
org.gradle.api.GradleScriptException: A problem occurred evaluating project ':subproject'.
...
Caused by: org.gradle.api.tasks.TaskInstantiationException: Could not create task of type 'CustomTask'.
...
Caused by: groovy.lang.MissingPropertyException: cannot get property 'myProp' on extra properties extension as it does not exist
...
BUILD FAILED
请注意,这似乎适用于:
答案 0 :(得分:32)
在构建脚本中读取名为foo
的额外属性的推荐语法是foo
或project.foo
(而不是ext.foo
),这也将搜索父项目'(额外)属性。编辑:在任务类中,您可以使用project.foo
。
值得注意的是,额外的属性仅适用于构建脚本中的临时脚本;任务类和插件应该不使用它们。任务类根本不应该进入Gradle对象模型;相反,它应声明允许构建脚本和/或插件为其提供所需信息的属性(以及必要时的方法)。这使得更容易理解,重用和记录任务类,并且可以通过@Input...
和@Output...
注释声明输入和输出。
PS:一个任务类通常有一个用doFirst
注释的方法,而不是在构造函数中调用@TaskAction
。