轉(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)行配置。
(本系列完)