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

Ala*_*ger 18 properties task gradle extra

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

归结起来,这就是问题所在.假设我有一个根Gradle构建脚本,build.gradle它设置了一个额外的项目属性,

project.ext.myProp = 'myValue'
Run Code Online (Sandbox Code Playgroud)

我有一个子项目settings.gradle,

include 'subproject'
Run Code Online (Sandbox Code Playgroud)

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

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

task custom(type: CustomTask) {
    println 'custom task'
}
Run Code Online (Sandbox Code Playgroud)

执行这个给了我这个:

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
Run Code Online (Sandbox Code Playgroud)

请注意,这似乎适用于:

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

Pet*_*ser 33

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

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

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

  • 如果你设置*`project.foo`(你不应该这样做),你只会得到弃用警告. (2认同)
  • 尝试在我的插件中设置project.ext和我自己疯了.这让我不知所措:**重要的是要注意额外的属性仅用于构建脚本中的临时脚本; 任务类和插件不应该使用它们.**感谢您保存我的理智.在我的情况下,我正在尝试使用我之前在脚本中处理的插件.但是,我会问为什么用户指南没有提出这些要点,而是显示用gradle构建文件编写的"插件"样本! (2认同)