Gradle學(xué)習(xí)系列之十——自定義Plugin

轉(zhuǎn)自:http://www.cnblogs.com/davenkin/p/gradle-learning-10.html

請(qǐng)通過(guò)以下方式下載本系列文章的Github示例代碼:

git clone https://github.com/davenkin/gradle-learning.git

在Plugin中,我們可以向Project中加入新的Task,定義configurations和property等。我們3種方法可以自定義Plugin,這些方法和自定義Task類型的3種方法相似。在接下來(lái)的例子中,我們將分別通過(guò)這3種方法來(lái)創(chuàng)建一個(gè)DateAndTimePlugin,該P(yáng)lugin定義了2個(gè)Task,分別用于輸出系統(tǒng)當(dāng)前的日期和時(shí)間,另外,我們可以配置日期和時(shí)間的輸出格式。

(一)在build.gradle文件中直接定義Plugin

和在build.gradle文件中定義Task類型一樣,我們可以將對(duì)Plugin的定義直接寫在build.gradle中:

apply plugin: DateAndTimePlugin

dateAndTime {

????timeFormat = 'HH:mm:ss.SSS'

????dateFormat = 'MM/dd/yyyy'

}

class DateAndTimePlugin implements Plugin<Project> {

????void apply(Project project) {

????????project.extensions.create("dateAndTime", DateAndTimePluginExtension)

????????project.task('showTime') << {

????????????println "Current time is " +newDate().format(project.dateAndTime.timeFormat)

????????}

????????project.tasks.create('showDate') << {

????????println "Current date is " +newDate().format(project.dateAndTime.dateFormat)

????????}

????}

}

class DateAndTimePluginExtension {

????String timeFormat = "MM/dd/yyyyHH:mm:ss.SSS"

????String dateFormat = "yyyy-MM-dd"

}

每一個(gè)自定義的Plugin都需要實(shí)現(xiàn)Plugin接口,事實(shí)上,除了給Project編寫Plugin之外,我們還可以為其他Gradle類編寫Plugin。該接口定義了一個(gè)apply()方法,在該方法中,我們可以操作Project,比如向其中加入Task,定義額外的Property等。

在上例中,我們?cè)贒ateAndTimePlugin中向Project添加了2個(gè)Task,一個(gè)名為showTime,一個(gè)名為showDate。請(qǐng)注意創(chuàng)建這2個(gè)Task所使用的不同方法,更多的創(chuàng)建Task的方法,請(qǐng)參考本系列這篇文章。

每個(gè)Gradle的Project都維護(hù)了一個(gè)ExtenionContainer,我們可以通過(guò)project.extentions進(jìn)行訪問(wèn),比如讀取額外的Property和定義額外的Property等。在DateAndTimePlugin中,我們向Project中定義了一個(gè)名為dateAndTime的extension,并向其中加入了2個(gè)Property,分別為timeFormat和dateFormat,他們又分別用于showTime和showDate。在使用該P(yáng)lugin時(shí),我們可以通過(guò)以下方式對(duì)這兩個(gè)Property進(jìn)行重新配置:

dateAndTime {

????timeFormat = 'HH:mm:ss.SSS'

????dateFormat = 'MM/dd/yyyy'

}

(二)在當(dāng)前工程中定義Plugin

在當(dāng)前工程中的buildSrc/src/main/groovy/davenkin目錄下創(chuàng)建DateAndTimePlugin.groovy文件,將build.gradle中定義DateAndTimePlugin的代碼提取到給文件中,但是除去對(duì)DateAndTimePluginExtension的定義,因?yàn)槲覀儗⒃诹硗庖粋€(gè)單獨(dú)的文件中定義DateAndTimePluginExtension。

package davenkin

importorg.gradle.api.Plugin

importorg.gradle.api.Project

class DateAndTimePlugin implements Plugin<Project> {

????void apply(Project project) {

????????project.extensions.create("dateAndTime", DateAndTimePluginExtension)

????????project.task('showTime') << {

????????????println "Current time is " +newDate().format(project.dateAndTime.timeFormat)

????????}

???????project.tasks.create('showDate') << {

????????println "Current date is " +newDate().format(project.dateAndTime.dateFormat)

????????}

????}

}

再創(chuàng)建DateAndTimePluginExtension.groovy:

package davenkin

classDateAndTimePluginExtension {

????String timeFormat = "MM/dd/yyyyHH:mm:ss.SSS"

????String dateFormat = "yyyy-MM-dd"

}

這里,我們將2個(gè)類文件都放在了davenkin包下。Gradle在執(zhí)行時(shí),會(huì)自動(dòng)掃描buildSrc目錄,并會(huì)在執(zhí)行Task之前構(gòu)建該目錄下的內(nèi)容。在build.gradle文件中,在apply該P(yáng)lugin時(shí),我們需要聲明對(duì)該P(yáng)lugin的全名稱,即包含報(bào)名:

apply plugin: davenkin.DateAndTimePlugin

dateAndTime {

timeFormat = 'HH:mm:ss.SSS'

dateFormat = 'MM/dd/yyyy'

}

執(zhí)行“gradle showTime”,命令行輸出如下:

:buildSrc:compileJava UP-TO-DATE

:buildSrc:compileGroovy UP-TO-DATE

:buildSrc:processResources UP-TO-DATE

:buildSrc:classes UP-TO-DATE

:buildSrc:jar UP-TO-DATE

:buildSrc:assemble UP-TO-DATE

:buildSrc:compileTestJava UP-TO-DATE

:buildSrc:compileTestGroovy UP-TO-DATE

:buildSrc:processTestResources UP-TO-DATE

:buildSrc:testClasses UP-TO-DATE

:buildSrc:test UP-TO-DATE

:buildSrc:check UP-TO-DATE

:buildSrc:build UP-TO-DATE:showTime

Current time is 19:08:35.489BUILD SUCCESSFUL

Total time: 2.995 secs

可以看到,Gradle會(huì)首先構(gòu)建buildSrc目錄,然后才執(zhí)行showTime(紅色部分)。

(三)在單獨(dú)的項(xiàng)目中創(chuàng)建Plugin

新建一個(gè)項(xiàng)目,將(二)中buildSrc目錄下的內(nèi)容拷貝到該項(xiàng)目下,定義該項(xiàng)目的build.gradle文件如下:

apply plugin: 'groovy'

apply plugin: 'maven'

version = 1.0

group = 'davenkin'

archivesBaseName = 'datetimeplugin'

repositories.mavenCentral()

dependencies {

????compile gradleApi()

????groovy localGroovy()

}

uploadArchives {

????repositories.mavenDeployer {

????repository(url: 'file:../lib')

????}

}

此外,我們還可以為該P(yáng)lugin重新命名,如果我們希望將該P(yáng)lugin命名為time,那么我們需要在src/main/resources/META-INF/gradle-plugins目錄下創(chuàng)建名為time.properties的文件,內(nèi)容如下:

implementation-class= davenkin.DateAndTimePlugin

在執(zhí)行“gradle uploadArchives”時(shí),Gradle會(huì)將該P(yáng)lugin打包成jar文件,然后將其上傳到上級(jí)目錄下的lib目錄中(../lib)。之后,在客戶端的build.gradle文件中,我們需要做如下定義:

buildscript {

????repositories {

????????maven {

????????????url 'file:../lib'

????????}

????}

????dependencies {

????????classpath group: 'davenkin', name: 'datetimeplugin',

????????version: '1.0'

????}

}

apply plugin: 'time'

dateAndTime {

????timeFormat = 'HH:mm:ss.SSS'

????dateFormat = 'MM/dd/yyyy'

}

首先我們配置repository以執(zhí)行l(wèi)ib目錄,然后聲明對(duì)DateAndTimePlugin的依賴,再apply該P(yáng)lugin,此時(shí)我們應(yīng)該使用“time”作為該P(yáng)lugin的名稱,最后對(duì)該P(yáng)lugin進(jìn)行配置。

(本系列完)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,586評(píng)論 19 139
  • 這篇文章講給大家?guī)?lái)gradle打包系列中的高級(jí)用法-自己動(dòng)手編寫gradle插件。我們平常在做安卓開(kāi)發(fā)時(shí),都會(huì)在...
    呆萌狗和求疵喵閱讀 16,340評(píng)論 22 80
  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,879評(píng)論 2 45
  • Gradle簡(jiǎn)介 Gradle是一個(gè)構(gòu)建工具,同時(shí)它也是一個(gè)編程框架。 當(dāng)你把Gradle當(dāng)構(gòu)建工具看的時(shí)候,我們...
    Rangethan閱讀 2,393評(píng)論 1 8
  • 最近樂(lè)樂(lè)遇到我和老公沒(méi)有經(jīng)過(guò)她的同意,而動(dòng)了她的東西后,她很生氣地說(shuō)我們時(shí),如果我們作解釋她會(huì)大聲說(shuō):我受不了啦!...
    陽(yáng)光灑灑閱讀 253評(píng)論 2 1

友情鏈接更多精彩內(nèi)容