1. ホーム
  2. groovy

[解決済み] gradleのタスク定義でgroovyの構文を理解する

2023-04-24 06:54:04

質問

私はGradleとGroovyの初心者で、gradleタスクが定義されるときにgroovyのレベルで何が起こっているかを理解しようとしています。

task hello  { 
   println "configuring task hello" 
   doLast {
     println "hello there" 
   }
}

Gradle In Action"を読んで、私はこのメソッドが task hello {} の呼び出しは、実際には task() メソッドの呼び出しです。 Project インターフェイスのメソッドです。77ページで、taskと呼ばれる4つのメソッドが Project インターフェイスで

task(args: Map<String,?>, name:String)
task(args: Map<String,?>, name:String, c:Closure)
task(name: String)
task(name: String, c:Closure)

というのはわかりますが {} はクロージャ本体です。

私が理解していないのは、groovyがどのように hellotask hello { } に従って https://stackoverflow.com/a/25592665/438319 を変換するgroovyコンパイラのプラグインがあります。 task hello { }task('hello', { })

私の質問

  • 変換を行うGradle Groovy Compilerプラグインについての情報はどこで見つけることができますか?

  • gradleは何らかの形でGroovyプログラミング言語を拡張しているので、Gradleスクリプトはgroovyプログラムであるという主張は技術的に正しくないのでしょうか?

  • を取得する方法はありますか? gradle コマンドを実行して、コンパイラプラグインが実行された後に生成された基本的なgroovyコードを出力する方法はありますか?

どのように解決するのですか?

Gradleは ASTトランスフォーメーション を使用して Groovy の構文を拡張します。あなたが言及したタスク定義の構文は、Gradleが適用する変換の1つに過ぎません。その変換のための実装を見つけることができます ここで . あなたの具体的な質問に答えるために。

  • Gradleが適用する個々の変換は、私が知る限りではどこにも特に文書化されていません。しかし、上記のリンクの同じパッケージの他のクラスを見ることができます。

  • Gradleスクリプトは、Groovy構文のスーパーセットをサポートしています。有効なGroovyはGradleスクリプトでも有効ですが、Gradleスクリプトは必ずしも有効な "default" Groovy ではありません(一般的にはそうです)。

  • メモリ内で操作されているのは実際の抽象構文木なので、同等のGroovyコードの出力を取得する方法はありません。