Gradle 1.12使用者指南翻譯——第二十一章. Gradle 外掛程式,gradle1.12
昨天晚上只顧著和女朋友看《匆匆那年》電視劇的最後幾集,所以說好的Android文檔《Gradle 外掛程式使用者指南》第五章自然也沒翻譯多少。所以今天也發不了第五章的翻譯了,就發幾個星期前譯好的《Gradle 1.12使用者指南》的第二十一章吧。
在部落格上發的其他章節的翻譯請參見:
http://blog.csdn.net/column/details/gradle-translation.html
翻譯項目請關注Github上的地址:
https://github.com/msdx/gradledoc/tree/1.12。
直接瀏覽雙語版的文檔請訪問:
http://gradledoc.qiniudn.com/1.12/userguide/userguide.html。
另外,Android 手機使用者可通過我寫的一個程式瀏覽文檔,帶緩衝功能的,相容2.1以上(5.0沒試過)的Android系統,地址如下:
http://www.wandoujia.com/apps/com.githang.gradledoc
翻譯不易,轉載請註明本文在CSDN部落格上的出處:
http://blog.csdn.net/maosidiaoxian/article/details/41977599
關於我對Gradle的翻譯,以Github上的項目及http://gradledoc.qiniudn.com 上的文檔為準。如有發現翻譯有誤的地方,將首先在以上兩個地方更新。因時間精力問題,部落格中發表的譯文基本不會同步修改。
第二十一章. Gradle 外掛程式
Gradle 在它的核心中有意地提供了一些小但有用的功能,用於在真實世界中的自動化。所有有用的功能,例如以能夠編譯 Java 代碼為例,都是通過外掛程式進行添加的。外掛程式添加了新任務 (例如JavaCompile
),域對象 (例如SourceSet
),約定(例如主要的 Java 原始碼是位於src/main/java
),以及擴充的核心對象和其他外掛程式的對象。
在這一章中,我們將討論如何使用外掛程式以及術語和外掛程式相關的概念。
21.1. 應用外掛程式
外掛程式都認為是被應用,通過Project.apply()
方法來完成。
樣本 21.1. 應用外掛程式
build.gradle
apply plugin: 'java'
外掛程式都有表示它們自己的一個簡短名稱。. 在上述例子中,我們使用簡短名稱java
去應用JavaPlugin
。
我們還可以使用下面的文法:
樣本 21.2. 通過類型應用外掛程式
build.gradle
apply plugin: org.gradle.api.plugins.JavaPlugin
由於 Gradle 的預設匯入 (見附錄 E,現有的 IDE 支援和如何應對不支援的情況),您還可以這樣寫:
樣本 21.3. 通過類型應用外掛程式
build.gradle
apply plugin: JavaPlugin
外掛程式的應用是等冪的。也就是說,一個外掛程式可以被應用多次。如果以前已應用了該外掛程式,任何進一步的應用都不會再有任何效果。
一個外掛程式是任何實現了 Plugin
介面的簡單的類。Gradle 提供了核心外掛程式作為其發行包的一部分,所以簡單地應用如上外掛程式是你所需要做的。然而,對於第三方外掛程式,你需要進行配置以使外掛程式在構建類路徑中可用。有關如何進行此操作的詳細資料,請參閱 59.5章節,“構建指令碼的外部依賴”。
關於編寫自己的外掛程式的詳細資料,請參閱 58章節,編寫自訂外掛程式。
21.2. 外掛程式都做了什麼
把外掛程式應用到項目中可以讓外掛程式來擴充項目的功能。它可以做的事情如:
- 將任務添加到項目 (如編譯、 測試)
- 使用有用的預設設定對已添加的任務進行預配置。
- 向項目中添加依賴配置 (見第 8.3 節,“依賴配置”)。
- 通過擴充對現有類型添加新的屬性和方法。
讓我們來看看:
樣本 21.4. 通過外掛程式新增工作
build.gradle
apply plugin: 'java'task show << { println relativePath(compileJava.destinationDir) println relativePath(processResources.destinationDir)}
gradle -q show
的輸出結果
> gradle -q showbuild/classes/mainbuild/resources/main
Java 外掛程式已經向項目添加了 compileJava
任務和processResources
任務,並且配置了這兩個任務的destinationDir
屬性。
21.3. 約定
外掛程式可以通過智能的方法對項目進行預配置以支援約定優於配置。Gradle 對此提供了機制和完善的支援,而它是強大-然而-簡潔的構建指令碼中的一個關鍵因素。
在上面的樣本中我們看到,Java 外掛程式添加了一個任務,名字為compileJava
,有一個名為destinationDir
的屬性(即配置編譯的 Java 代碼存放的地方)。Java 外掛程式預設此屬性指向項目目錄中的build/classes/main
。這是通過一個合理的預設的約定優於配置的例子。
我們可以簡單地通過給它一個新的值來更改此屬性。
樣本 21.5. 更改外掛程式的預設設定
build.gradle
apply plugin: 'java'compileJava.destinationDir = file("$buildDir/output/classes")task show << { println relativePath(compileJava.destinationDir)}
gradle -q show
的輸出結果
> gradle -q showbuild/output/classes
然而, compileJava
任務很可能不是唯 一需要知道類檔案在哪裡的任務。
Java 外掛程式添加了 source sets 的概念 (見SourceSet
) 來描述的源檔案集的各個方面,其中一個方面是在編譯的時候這些類檔案應該被寫到哪個地方。Java 外掛程式將compileJava
任務的destinationDir
屬性對應到源檔案集的這一個方面。
我們可以通過這個源碼集修改寫入類檔案的位置。
樣本 21.6. 外掛程式中的約定對象
build.gradle
apply plugin: 'java'sourceSets.main.output.classesDir = file("$buildDir/output/classes")task show << { println relativePath(compileJava.destinationDir)}
gradle -q show
的輸出結果
> gradle -q showbuild/output/classes
在上面的樣本中,我們應用 Java 外掛程式,除其他外,還做了下列操作:
- 添加了一個新的域物件類型:
SourceSet
- 通過屬性的預設(即常規)配置了
main
源碼集
- 配置支援使用這些屬性來執行工作的任務
所有這一切都發生在apply plugin: "java"
這一步過程中。在上面例子中,我們在約定配置被執行之後,修改了類檔案所需的位置。在上面的樣本中可以注意到,compileJava.destinationDir
的值也被修改了,以反映出配置的修改。
考慮一下另一種消費類檔案的任務的情況。如果這個任務使用sourceSets.main.output.classesDir
的值來配置,那麼修改了這個位置的值,無論它是什麼時候被修改,將同時更新compileJava
任務和這一個消費者任務。
這種設定物件的屬性以在所有時間內(甚至當它更改的時候)反映另一個對象的任務的值的能力被稱為“映射約定”。它可以令 Gradle 通過約定優於配置及合理的預設值來實現簡潔的配置方式。而且,如果預設約定需要進行修改時,也不需要進行完全的重新設定。如果沒有這一點,在上面的例子中,我們將不得不重新設定需要使用類檔案的每個對象。
21.4.