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

21

我想在多个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

请注意,如果满足以下条件,则似乎可以使用此方法:

  • 自定义任务与额外属性一起在根项目中定义
  • 如果您使用动态属性而不是额外属性,则可以使用此方法,但这些已被弃用

(Note that this seems to work if: - the custom task is defined in the root project alongside the extra property - if you use dynamic properties instead of extra properties, but those are deprecated)
1个回答

35
在build脚本中,读取名为“foo”的额外属性的推荐语法是fooproject.foo(而不是ext.foo),这也会搜索父项目的(额外)属性。编辑:在任务类中,您可以使用project.foo
需要注意的是,额外属性仅用于build脚本中的临时脚本编写;任务类和插件不应使用它们。任务类不应该完全依赖Gradle对象模型;相反,它应该声明属性(以及必要时方法),允许build脚本和/或插件提供其所需的所有信息。这样可以更容易地理解、重用和记录任务类,并且可以通过@Input...@Output...注释声明输入和输出。
附注:任务类通常具有一个用@TaskAction注释的方法,而不是在构造函数中调用doFirst

1
当我使用project.foo而不是project.ext.foo时,会收到有关使用动态项目属性的弃用警告。 - Alan Krueger
2
只有在你设置 project.foo(这是不应该做的)时,才会收到弃用警告。 - Peter Niederwieser
1
你的评论帮助我解决了这个问题。我发现使用Task.configure是在多个任务之间共享公共配置的一种更简单、更清晰的方式。我现在正在使用它。 - Alan Krueger
2
在我的插件中,我一直试图设置project.ext这个和那个,让自己感到非常疯狂。但是这句话让我恍然大悟:需要注意的是,额外的属性仅适用于构建脚本中的即席脚本;任务类和插件不应使用它们。 感谢您挽救了我的理智。在我的情况下,我正在尝试将之前在脚本中处理的内容转移到插件中。然而,我想问为什么用户指南没有提到这些要点,而是展示了在gradle构建文件中编写的“插件”示例! - Steve Cohen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接