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' を取得できませんでした」が生成されます。
私の質問は、クロージャーに対して呼び出されたときに「greet」変数がどのように検出されるかですが、通常の変数として使用されたときに検出されないことです。舞台裏で起こっている Groovy/Gradle マジックとは?