2014-01-17 37 views
13

Gradle User Guide經常提到Gradle是聲明式並且使用建立按照慣例。這是什麼意思?在Gradle深層解釋中,什麼是按照約定建立的?

從我的理解這意味着,例如,在的Java插件有像 源公約必須在src/main/java,測試必須在src/main/test,在src/main/resources資源,準備罐子在build/libs等。但是,Gradle並不強制你使用這些約定,如果你願意,你可以改變它們。

但第二個概念,我有一個更大的理解問題。像SQL一樣,你可以說你想對你的查詢做什麼,但是不要說數據庫系統如何獲取它們,使用哪種算法來提取數據等。

請告訴我更多的正確理解這些概念。謝謝。

+0

你是說你對理解* first *概念有更大的問題(聲明式)? –

+0

我都以一種方式理解它,但我不知道它是否正確。 – Xelian

回答

10

您瞭解按照慣例構建是正確的,不得不在那裏添加任何東西。 (另見傑夫的回答。)

背後聲明的想法是,你不必對任務級別的工作,執行/聲明/配置所有任務及其依賴自己,但可以在較高的工作,更多的聲明級別。您只是說「這是一個Java項目」(apply plugin: "java"),「這是我的二進制存儲庫」(repositories { ... }),「這裏是我的源代碼」(sourceSets { ... }),「這些是我的依賴項」(dependencies { ... })。基於這個聲明性信息,Gradle將確定需要哪些任務,它們的依賴關係以及如何配置它們。

6

按照慣例構建的想法是,如果遵循默認約定,那麼您的構建會簡單得多。所以雖然你可以更改源目錄,你不需要明確指定源目錄。 Gradle帶有邏輯默認值。這也被稱爲約定優於配置

這部分編輯成約聲明性質基於彼得的回答更加清晰:

構建是聲明的想法是,你不需要指定每一個步驟需要完成。你不會說「做第1步,做第2步,等等」。您定義需要應用的插件(或任務),然後gradle,然後構建一個任務執行圖並計算出執行操作的順序。

10

爲了理解declarative編程風格,將其與imperative programming風格進行比較和對比是有用的。

聲明式編程允許我們指定什麼我們想完成。

在命令性編程中,我們指定如何我們完成了一些工作。

所以,當我們使用gradle產出,彼得描述,我們做聲明,聲明如,「這是一個Java項目」或「這是一個Java Web應用程序」,然後

搖籃,利用了提供處理諸如「Java項目」或「Web應用程序」之類的東西的服務的插件。這很好,因爲它是包含實現細節的Gradle插件,這些細節涉及編譯java類構建war文件等任務。

將此與另一個構建系統Make進行對比,這在本質上是更加迫切的。讓我們來看一個簡單的創建規則從here採取:

foo.o : foo.c defs.h  
     cc -c -g foo.c 

所以在這裏,我們看到,描述規則如何建立從C源文件中的目標文件foo.o的和C頭文件。

制定規則有兩件事。

第一行說foo.o文件依賴於foo.c和foo.h. Make知道如何檢查文件foo.o上的時間戳以查看它是否比文件foo.c和foo.h更早,這一行是一種聲明。如果foo.o比較老,那麼Make會調用下一行的命令。

下一行是必需的。

第二行指定如果foo.o文件比foo.c或foo.h文件中的任何一個都舊,那麼運行的命令(cc - 一個C編譯器)。還要注意,編寫Makefile規則的人必須知道傳遞給cc命令的標誌。