20

我正在尝试在多个 Gradle 任务之间重用通用逻辑,类似于此答案中的建议,但我遇到了额外项目属性不可见的问题。

归根结底,问题来了。假设我有一个根 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

请注意,这似乎在以下情况下有效:

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

1 回答 1

35

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

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

PS:doFirst任务类通常没有调用构造函数,而是有一个用@TaskAction.

于 2013-01-25T22:42:03.130 回答