2017-07-30 3 views
0

私は、どのようにgradleビルドスクリプトがフードの下で解釈されるのかを理解しようとしています。フード内のGradleタスクのインライン設定はどのように機能しますか?

私たちは

task taskName 

を入力するときに、我々は名前としてタスクとプロジェクトオブジェクトで定義された関数を実行し、文字列パラメータを取っている、プロジェクトのオブジェクトに全体のビルドスクリプトを委譲することを取得します。私にとっては奇妙である何

は、タスクのインライン構成です:

taskName.description = "Description of the task" 
taskName.group = "Group of the task" 

これは本当にプロジェクトオブジェクトのレベルでどのように動作しますか?

答えて

0

最初の「プロパティ」セクションhttps://docs.gradle.org/current/dsl/org.gradle.api.Project.htmlを見てください。

プロジェクトは、それがプロパティを検索5プロパティ「スコープ」を持っている:ここで

は削除の詳細の一部と便利なビットです。スコープは次のとおりです。

  • Projectオブジェクト自体です。
  • プロジェクトの追加のプロパティ。
  • 拡張機能は、プラグインによってプロジェクトに追加されました。
  • プロジェクトのタスク。

プロジェクトの親から継承された、ルートプロジェクトまで再帰的に継承された追加のプロパティと規則プロパティ。このスコープのプロパティは読み取り専用です。

プロパティを読み取るとき、プロジェクトは上記のスコープを順番に検索し、プロパティを見つける最初のスコープから値を返します。見つからなければ、例外がスローされます。あなたの例では

taskName.description = "..."はGradleのは、拡張機能として、追加のプロパティとして、Projectに方法としてtaskNameを調べ、それがその名前で仕事を見つけることを意味します。次に、通常のTaskオブジェクトでsetDescriptionと呼ぶだけです。

魔法がそうのように構成されたExtensibleDynamicObjectを使用してProject.property()で起こる: https://github.com/gradle/gradle/blob/0b9cb4429513297e03965b0578607d10a2a1fcdf/subprojects/core/src/main/java/org/gradle/api/internal/project/DefaultProject.java#L226-L230

+0

は、しかし、正確に新しいタスクを宣言するの相との間で起こるかについての記載はない、私は非常に役に立ったご回答いただきありがとうございますし、それをプロパティとしてアクセスする段階! これはどのようにして、新しいタスクを作成する関数への呼び出しに基づいて、どのようにプロパティとしてこのタスクにアクセスできるのかを知りたいですか? もう一度ありがとうございます。 –

+1

タスクがプロジェクトオブジェクトの動的プロパティとして追加されることはありますか? –

+0

タスクを作成すると、タスクリストに追加されます。これは、Project、余分なプロパティ、または拡張のメソッドではないものを探すときにチェックされる同じタスクリストです。これはすべて、プロパティの動的ルックアップの一部として発生します。 – bigguy

関連する問題