Gradle學習系列之十——自定義Plugin(本系列完)


  在本系列上篇文章中,我們講到了如何自定義Task類型,在本篇文章中,我們將講到如何自定義Plugin。

 

  請通過以下方式下載本系列文章的Github示例代碼:

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

 


 

  在Plugin中,我們可以向Project中加入新的Task,定義configurations和property等。我們3種方法可以自定義Plugin,這些方法和自定義Task類型的3種方法相似。在接下來的例子中,我們將分別通過這3種方法來創建一個DateAndTimePlugin,該Plugin定義了2個Task,分別用於輸出系統當前的日期和時間,另外,我們可以配置日期和時間的輸出格式。

 

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

  和在build.gradle文件中定義Task類型一樣,我們可以將對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 " + new Date().format(project.dateAndTime.timeFormat) } project.tasks.create('showDate') << { println "Current date is " + new Date().format(project.dateAndTime.dateFormat) } } } class DateAndTimePluginExtension { String timeFormat = "MM/dd/yyyyHH:mm:ss.SSS" String dateFormat = "yyyy-MM-dd" }

 

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

  在上例中,我們在DateAndTimePlugin中向Project添加了2個Task,一個名為showTime,一個名為showDate。請注意創建這2個Task所使用的不同方法,更多的創建Task的方法,請參考本系列這篇文章

  每個Gradle的Project都維護了一個ExtenionContainer,我們可以通過project.extentions進行訪問,比如讀取額外的Property和定義額外的Property等。在DateAndTimePlugin中,我們向Project中定義了一個名為dateAndTime的extension,並向其中加入了2個Property,分別為timeFormat和dateFormat,他們又分別用於showTime和showDate。在使用該Plugin時,我們可以通過以下方式對這兩個Property進行重新配置:

dateAndTime { timeFormat = 'HH:mm:ss.SSS' dateFormat = 'MM/dd/yyyy' }

 

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

  在當前工程中的buildSrc/src/main/groovy/davenkin目錄下創建DateAndTimePlugin.groovy文件,將build.gradle中定義DateAndTimePlugin的代碼提取到給文件中,但是除去對DateAndTimePluginExtension的定義,因為我們將在另外一個單獨的文件中定義DateAndTimePluginExtension。

package davenkin import org.gradle.api.Plugin import org.gradle.api.Project class DateAndTimePlugin implements Plugin<Project> { void apply(Project project) { project.extensions.create("dateAndTime", DateAndTimePluginExtension) project.task('showTime') << { println "Current time is " + new Date().format(project.dateAndTime.timeFormat) } project.tasks.create('showDate') << { println "Current date is " + new Date().format(project.dateAndTime.dateFormat) } } }

 

  再創建DateAndTimePluginExtension.groovy:

package davenkin class DateAndTimePluginExtension { String timeFormat = "MM/dd/yyyyHH:mm:ss.SSS" String dateFormat = "yyyy-MM-dd" }

 

  這里,我們將2個類文件都放在了davenkin包下。Gradle在執行時,會自動掃描buildSrc目錄,並會在執行Task之前構建該目錄下的內容。在build.gradle文件中,在apply該Plugin時,我們需要聲明對該Plugin的全名稱,即包含報名:

apply plugin: davenkin.DateAndTimePlugin dateAndTime { timeFormat = 'HH:mm:ss.SSS' dateFormat = 'MM/dd/yyyy' }

 

  執行“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.489 BUILD SUCCESSFUL Total time: 2.995 secs

 

  可以看到,Gradle會首先構建buildSrc目錄,然后才執行showTime(紅色部分)。

 

(三)在單獨的項目中創建Plugin

  新建一個項目,將(二)中buildSrc目錄下的內容拷貝到該項目下,定義該項目的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') } }

 

  此外,我們還可以為該Plugin重新命名,如果我們希望將該Plugin命名為time,那么我們需要在src/main/resources/META-INF/gradle-plugins目錄下創建名為time.properties的文件,內容如下: 

implementation-class = davenkin.DateAndTimePlugin

 

  在執行“gradle uploadArchives”時,Gradle會將該Plugin打包成jar文件,然后將其上傳到上級目錄下的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以執行lib目錄,然后聲明對DateAndTimePlugin的依賴,再apply該Plugin,此時我們應該使用“time”作為該Plugin的名稱,最后對該Plugin進行配置。

(本系列完)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM