【问题标题】:Gradle extra properties not visible in a custom task defined in a subprojectGradle 额外属性在子项目中定义的自定义任务中不可见
【发布时间】:2013-01-09 22:53:23
【问题描述】:

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

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

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

【问题讨论】:

    标签: properties task gradle extra


    【解决方案1】:

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

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

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

    【讨论】:

    • 当我使用 project.foo 而不是 project.ext.foo 时,我会收到有关使用动态项目属性的弃用警告。
    • 只有在您设置 project.foo(您不应该这样做)时,您才会收到弃用警告。
    • 您的 cmets 帮助我解决了这个问题。我发现使用 Task.configure 是一种在多个任务之间共享通用配置的更简单、更简洁的方法。我正在使用它。
    • 试图在我的插件中设置 project.ext 这个和那个,让自己发疯。这让我大吃一惊:需要注意的是,额外的属性仅适用于构建脚本中的临时脚本;任务类和插件不应使用它们。 感谢您拯救我的理智。在我的情况下,我正在尝试使用我之前在脚本中处理过的插件。但是,我会问为什么用户指南没有提出这些要点,而是显示用 gradle 构建文件编写的“插件”示例!
    猜你喜欢
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    相关资源
    最近更新 更多