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

Properties 渐变额外属性在子项目中定义的自定义任务中不可见,properties,task,gradle,extra,Properties,Task,Gradle,Extra,我试图在多个Gradle任务中重用公共逻辑,类似于中所建议的,但是我遇到了额外项目属性不可见的问题 简而言之,问题出在这里。假设我有一个根Gradle构建脚本,build.Gradle,它设置了一个额外的项目属性 project.ext.myProp = 'myValue' class CustomTask extends DefaultTask { CustomTask() { doFirst { println project.ext.myP

我试图在多个Gradle任务中重用公共逻辑,类似于中所建议的,但是我遇到了额外项目属性不可见的问题

简而言之,问题出在这里。假设我有一个根Gradle构建脚本,
build.Gradle
,它设置了一个额外的项目属性

project.ext.myProp = 'myValue'
class CustomTask extends DefaultTask {
    CustomTask() {
        doFirst {
            println project.ext.myProp
        }
    }
}

task custom(type: CustomTask) {
    println 'custom task'
}
我在
设置.gradle
中定义了一个子项目

include 'subproject'
子项目定义并使用引用该额外项目属性的自定义任务

project.ext.myProp = 'myValue'
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
请注意,在以下情况下,这似乎是可行的:

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

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

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


PS:当我使用
project.foo
而不是
project.ext.foo
时,任务类通常使用
@TaskAction

注释方法,而不是在构造函数中调用
doFirst
,我收到有关使用动态项目属性的弃用警告。只有在设置了
project.foo
(您不应该这样做)时,才会收到弃用警告。您的评论帮助我解决了此问题。我发现使用Task.configure在多个任务之间共享公共配置是一种更简单、更干净的方法。我用它来代替。在我的插件中设置project.ext这个和那个让我发疯。这让我大开眼界:需要注意的是,额外的属性只适用于构建脚本中的临时脚本;任务类和插件不应该使用它们。谢谢你救了我的命。在我的情况下,我正试图将我之前在脚本中处理过的东西驱动到插件中。然而,我想问为什么《用户指南》没有提到这些要点,而是展示了用gradle构建文件编写的“插件”示例!