Gradle额外属性在子项目中定义的自定义任务中不可见

时间:2013-01-25 21:47:58

标签: properties task gradle extra

我正在尝试在多个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

请注意,这似乎适用于:

  • 自定义任务在根项目中与额外属性一起定义
  • 如果您使用动态属性而不是额外属性,但不推荐使用这些属性

1 个答案:

答案 0 :(得分:32)

在构建脚本中读取名为foo的额外属性的推荐语法是fooproject.foo(而不是ext.foo),这也将搜索父项目'(额外)属性。编辑:在任务类中,您可以使用project.foo

值得注意的是,额外的属性仅适用于构建脚本中的临时脚本;任务类和插件应该使用它们。任务类根本不应该进入Gradle对象模型;相反,它应声明允许构建脚本和/或插件为其提供所需信息的属性(以及必要时的方法)。这使得更容易理解,重用和记录任务类,并且可以通过@Input...@Output...注释声明输入和输出。

PS:一个任务类通常有一个用doFirst注释的方法,而不是在构造函数中调用@TaskAction