35

Gradleを学ぼうとしています。私が好む学習スタイルは、何が起こっているのかを低レベルで理解することです。そのために、 DSLリファレンスに関してドキュメントの例6.1で何が起こっているのかを解釈しようとしています。

task hello {
    doLast {
        println 'Hello world!'
    }
}

このスクリプトがのコンテキストで実行されることを理解していますProjectProject したがって、ドキュメントから、オーバーロードされたメソッドがいくつかあることがわかりtask(...)ます。署名を見て、最後の引数としてクロージャを持つものを選択する必要があります。そして、ここを渡していないので、Map呼び出されているメソッドはであると仮定しtask(String name, Closure closure)ます。

ただし、私が苦労しているのは、このスクリプトでリテラル文字列helloがにマップされる方法Stringです。

別の例は例6.7です:

task taskX(dependsOn: 'taskY') << {
    println 'taskX'
}

task taskY << {
    println 'taskY'
}

task(Map<String, ?> args, String name)ここでは、メソッドのフォームを呼び出していると仮定します。だが、

  1. 繰り返しますが、リテラル文字列はどのようにしtaskXString
  2. リテラルを構成するために括弧が使用されていない場合、括弧Map内の部分はどのようにしてMap
  3. どのメソッドが呼び出されているかを正しく理解していれば、DSLのドキュメントと比較して、スクリプトで引数が間違った順序で指定されていませんか?
  4. 括弧を使用した構文は、メソッド呼び出しのように世界中を検索します。これは、不明なメソッドとしてProject解決するオブジェクトへの委任を示している可能性があります。ただし、AFAIK、メソッド呼び出しは、直前taskXのメソッド呼び出しを考えると、この時点では構文的に有効ではありません。task

ご覧のとおり、構文例がDSLリファレンスガイドにどのようにマッピングされるかについて少し混乱しているため、草の根レベルで何が起こっているのかを実際に理解するのは少し難しいです。

ありがとう!

4

2 に答える 2

23

タスク宣言構文のtask fooバリエーションは、Groovyコンパイラプラグインを使用して実装されるという点で特別です。私の知る限り、これはコンパイラプラグインが特別な構文をサポートするために使用される唯一のケースです。

于 2012-09-07T22:56:19.727 に答える