0

我的 build.gradle 中有以下代码:

class GreetingPlugin implements Plugin<Project> {
  def void apply(Project project) {

      project.convention.plugins.greeting = new GreetingPluginConvention()

      project.task('hello') {
          doLast {
            println project.convention.plugins.greeting.message
          }
      }
  }
}

class GreetingPluginConvention {
  String message

  def greet(Closure closure) {
      closure.delegate = this
      closure()
  }
}

apply plugin: GreetingPlugin

greet {
  message = 'Hi from Gradle'
}

它执行得很好 -./gradlew hello打印出预期的“Hi from Gradle”。

greet但是,在脚本中使用变量(例如println greet)会产生“无法为 org.gradle.api.Project 类型的项目 ':app' 获取未知属性 'greet'”。

我的问题是 - 在针对闭包调用时如何找到“问候”变量,但在用作常规变量时找不到。幕后发生了什么 Groovy/Gradle 魔法?

4

1 回答 1

0

当它在闭包中被调用时,

greet {
  message = 'Hi from Gradle'
}

您实际上是在向 GreetingPluginConvention 中定义的原始问候块/闭包添加更多代码,它不是变量,因此尝试将其视为此类失败。将这些块闭包视为设置或配置插件的便捷方式。

Gradle 脚本与一般的线性脚本有点不同。

于 2021-08-11T12:54:09.947 回答