天天看點

Gradle自定義插件Gradle自定義插件

在Gradle中建立自定義插件,Gradle提供了三種方式:

在build.gradle腳本中直接使用

在buildSrc中使用

在獨立Module中使用

開發Gradle插件可以在IDEA中進行開發,也可以在Android Studio中進行開發,它們唯一的不同,就是IDEA提供了Gradle開發的插件,比較友善建立檔案和目錄,而Android Studio中,開發者需要手動建立(但實際上,這些目錄并不多,也不複雜,完全可以手動建立)。

在Android Studio中建立一個标準的Android項目,整個目錄結構如下所示:

其中,除了buildSrc目錄以外,都是标準的Android目錄,而buildSrc就是Gradle提供的在項目中配置自定義插件的預設目錄,開發Gradle要建立的目錄,也就是RootProject/src/main/groovy和RootProject/src/main/resources兩個目錄。

在配置完成後,如果配置正确,對應的檔案夾将被IDE所識别,成為對應類别的檔案夾。

首先,先來配置buildSrc目錄下的build.gradle檔案,這個配置比較固定,腳本如下所示:

接下來,在groovy目錄下,建立一個Groovy類(與Java類似,可以帶包名,但Groovy類以.grovvy結尾),如圖所示:

Gradle自定義插件Gradle自定義插件

在腳本中通過實作gradle的Plugin接口,實作apply方法即可,腳本如下所示:

在如上所示的腳本的apply方法中,筆者簡單的實作了一個task,命名為testPlugin,執行該Task,會輸出一行日志。

所謂Groovy腳本的Extension,實際上就是類似于Gradle的配置資訊,在主項目使用自定義的Gradle插件時,可以在主項目的build.gradle腳本中通過Extension來傳遞一些配置、參數。

建立一個Extension,隻需要建立一個Groovy類即可,如圖所示:

Gradle自定義插件Gradle自定義插件

如上所示,筆者命名了一個叫MyExtension的groovy類,其腳本如下所示:

MyExtension代碼非常簡單,就是定義了要配置的參數變量,後面筆者将具體示範如何使用。

在建立了Extension之後,需要修改下之前建立的Groovy類來加載Extension,修改後的腳本如下所示:

通過project.extensions.create方法,來将一個Extension配置給Gradle即可。

resources目錄是辨別整個插件的目錄,其目錄下的結構如下所示:

└── resources

└── META-INF

└── gradle-plugins

該目錄結構與buildSrc一樣,是Gradle插件的預設目錄,不能有任何修改。建立好這些目錄後,在gradle-plugins目錄下建立——插件名.properties檔案,如圖所示:

Gradle自定義插件Gradle自定義插件

如上所示,這裡筆者命名為pluginsrc.properties,在該檔案中,代碼如下所示:

通過上面的代碼指定最開始建立的Groovy類即可。

在主項目的build.gradle檔案中,通過apply指令來加載自定義的插件,腳本如下所示:

其中plugin的名字,就是前面建立pluginsrc.properties中的名字——pluginsrc,通過這種方式,就加載了自定義的插件。

在主項目的build.gradle檔案中,通過如下所示的代碼來加載Extension:

同樣,領域名為插件名,配置的參數就是在Extension中定義的參數名。

配置完畢後,就可以在主項目中使用自定義的插件了,在終端執行gradle testPlugin指令,結果如下所示:

在buildSrc中建立自定義Gradle插件隻能在目前項目中使用,是以,對于具有普遍性的插件來說,通常是建立一個獨立的Module來建立自定義Gradle插件。

首先,在主項目的工程中,建立一個普通的Android Library Module,并删除其預設建立的目錄,修改為Gradle插件所需要的目錄,即在buildSrc目錄中的所有目錄,如圖所示:

Gradle自定義插件Gradle自定義插件

如上圖所示,建立的檔案與在buildSrc目錄中建立的檔案都是一模一樣的,隻是這裡在一個自定義的Module中建立插件而不是在預設的buildSrc目錄中建立。

因為是通過自定義Module來建立插件的,是以,不能讓Gradle來自動完成插件的加載,需要手動進行部署,是以,需要在插件的build.gradle腳本中增加Maven的配置,腳本如下所示:

相比buildSrc中的build.gradle腳本,這裡增加了Maven的支援和uploadArchives這樣一個Task,這個Task的作用就是将該Module部署到本地的repo目錄下。在終端中執行gradle uploadArchives指令,将插件部署到repo目錄下,如圖所示:

Gradle自定義插件Gradle自定義插件

當插件部署到本地後,就可以在主項目中引用插件了。

當插件正式釋出後,可以把插件像其它module一樣釋出到中央庫,這樣就可以像使用中央庫的庫項目一樣來使用插件了。

在buildSrc中,系統自動幫開發者自定義的插件提供了引用支援,但自定義Module的插件中,開發者就需要自己來添加自定義插件的引用支援。在主項目的build.gradle檔案中,添加如下所示的腳本:

其中,classpath指定的路徑,就是類似compile引用的方式,即——插件名:group:version

如果不使用本地Maven Repo來部署,也可以拿到生成的插件jar檔案,複制到libs目錄下,通過如下所示的代碼來引用:

繼續閱讀