2012-09-07 28 views
29

我在學習Gradle。我喜歡的學習方式是在低層次上理解正在發生的事情。爲此,我試圖解釋發生的事情在文檔的example 6.1關於DSL reference:如何解釋Gradle DSL

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

據我所知,這個腳本是在一個Project的上下文中執行。因此,我可以從Projectdocumentation看到,有許多重載task(...)方法。看着簽名,我需要選擇一個具有閉包作爲最終參數的簽名。由於我們在這裏沒有通過Map,我假設被調用的方法是task(String name, Closure closure)

但是,我正在努力的部分是如何在此腳本中將文字字符串hello映射到String

另一個例子是example 6.7

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

task taskY << { 
    println 'taskY' 
} 

在這裏,我認爲我們正在調用task(Map<String, ?> args, String name)形式的方法。但是,

  1. 再次,文字字符串taskX如何以String結尾?
  2. 由於括號不用於構建Map文字,如何在括號中的部分最終會被Map
  3. 如果我正確地計算出被稱爲哪一種方法,都沒有比DSL文檔中的腳本錯誤的順序給出的參數?
  4. 使用括號內的語法看起來所有的世界就像一個方法調用。這可能表示對Project對象的授權將解決taskX作爲未知方法。但是,AFAIK,考慮到方法調用前面的task,方法調用在此時不會在語法上有效。

正如你可以看到我有點困惑,實例語法下來怎麼映射到DSL參考指南,這使得它有點棘手,我真正瞭解發生了什麼事在基層。

謝謝!

+1

我和你有同樣的困惑。我真的希望Gradleware能提供一些解釋。 – peacepassion

+0

這個問題可能是更詳細的。 [gradle任務定義中的常規語法](http://stackoverflow.com/questions/27584463/understanding-the-groovy-syntax-in-a-gradle-task-definition/27584555#27584555) – user3875388

+0

可能的重複[Understanding在gradle這個任務定義的常規語法(https://stackoverflow.com/questions/27584463/understanding-the-groovy-syntax-in-a-gradle-task-definition) – tkruse

回答

17

任務聲明語法的task foo變化,它的使用Groovy的編譯器插件實現的是特殊的。據我所知,這是使用編譯器插件來支持特殊語法的唯一情況。

+4

有趣。我對Groovy比較陌生,而且我不喜歡的一件事是,當人們完成像這樣「聰明」的事情時,弄清楚發生了什麼事情是多麼困難 - 通常是爲了使他們的DSL易於使用/寫入。關於如何在腳本和DSL參考指南之間進行翻譯(在我的腦海中),您有任何具體的建議嗎? – dty

+0

語法記錄在用戶指南和DSL參考中;注意他們如何談論任務*關鍵字*。回想起來,它可能有點超過頂端,雖然它比非魔術替代品讀得更好。正如我所說,這是一個罕見的例外。考慮到你如何分析這裏一定存在「錯誤」,你很快就會理解Gradle DSL覆蓋下發生的所有其他事情。 –

+0

謝謝彼得。最後一個問題,如果我可以的話。你能指點我在Gradle源代碼中的正確位置來查看這個編譯器插件嗎? – dty

相關問題