本文首發於微信公衆號「劉望舒」html
相關文章
Gradle核心思想(一)爲何如今要用Gradle?
Gradle核心思想(二)Gradle入門前奏
Gradle核心思想(三)Groovy快速入門指南
Gradle核心思想(四)看似無用,實則重要的Gradle Wrapper
Gradle核心思想(五)通俗易懂的Gradle插件講解前端
在上一篇文章Gradle核心思想(五)通俗易懂的Gradle插件講解中,我介紹了什麼是Gradle插件、如何使用Gradle插件、Gradle插件的做用和好處,因爲篇幅的緣由,還有一個重要的知識點沒有講,那就是自定義Gradle插件(自定義Gradle對象插件)。自定義Gradle插件主要有三種方式,分別是build.gradle中編寫、buildSrc工程項目中編寫、獨立項目中編寫。建議閱讀本文前,先閱讀開頭列出的本系列相關文章。java
對象插件是實現了org.gradle.api.plugins接口的插件,這個接口中只定義個一個簡單的apply方法,想要實現自定義插件就須要去實現org.gradle.api.plugins接口。 Groovy、Java、Kotlin均可以做爲實現插件的語言,在本文的示例中,使用Groovy做爲實現語言。 在實際工做中咱們不多會在build.gradle中編寫自定義插件,這裏是爲了帶你們寫個最簡單的例子,能夠最快最直接的瞭解什麼是自定義插件。git
這裏使用IntelliJ來編輯(AS也能夠),首先新建一個Groovy工程: 程序員
定義項目的GroupId和ArtifactId: github
build.gradleapi
apply plugin:CustomPlugin
class CustomPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.task('CustomPluginTask') {
doLast {
println "自定義插件"
}
}
}
}
複製代碼
在build.gradle中自定義了一個插件CustomPlugin,在apply方法中建立一個名稱爲CustomPluginTask的任務。在IntelliJ的Terminal中輸入gradlew.bat CustomPluginTask來執行CustomPluginTask任務。 微信
再舉一個簡單的插件拓展例子,經過插件拓展來配置CustomPluginTask的輸出字符串,以下所示。 build.gradleapp
class CustomPluginPluginExtension {
String message = 'from CustomPlugin'
}
class CustomPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
def extension = project.extensions.create('custom', CustomPluginPluginExtension)//1
project.task('CustomPluginTask') {
doLast {
println extension.message
}
}
}
}
apply plugin: CustomPlugin
custom.message = "自定義插件拓展"//2
複製代碼
CustomPluginPluginExtension類中定義了message變量,CustomPluginPluginExtension是一個Groovy Bean(相似於JavaBean)。註釋1處用於添加拓展插件CustomPluginPluginExtension到插件列表中,名稱爲custom。註釋2處設置CustomPluginPluginExtension的message值。 Terminal中輸入gradlew.bat CustomPluginTask來執行CustomPluginTask任務。 maven
除了在build.gradle中編寫的自定義插件,還能夠將插件的源代碼放在rootProjectDir/buildSrc/src/main/groovy目錄中,Gradle會自動識別來完成編譯和測試。 在第一節的工程根目錄下創建/buildSrc/src/main/groovy目錄,以下圖所示。
import org.gradle.api.Plugin;
import org.gradle.api.Project;
class CustomPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.task('CustomPluginTask') {
doLast {
println "自定義插件"
}
}
}
}
複製代碼
修改build.gradle爲以下的內容:
build.gradle
apply plugin: CustomPlugin
複製代碼
Terminal中輸入gradlew.bat CustomPluginTask來執行CustomPluginTask任務,會打印出咱們想要的結果。
不管是在build.gradle中編寫自定義插件,仍是buildSrc項目中編寫自定義插件,都只能在本身的項目中進行使用。若是想要分享給其餘人或者本身用,能夠在一個獨立的項目中編寫插件,這個項目會生成一個包含插件類的JAR文件,有了JAR文件就很容易進行分享了。
爲了和前兩種方式進行區分,用IntelliJ新建一個Groovy工程,個人工程名爲CustomPluginShare,後面會用到。 配置build.gradle
apply plugin: 'groovy'
dependencies {
compile gradleApi()
compile localGroovy()
}
複製代碼
應用Groovy插件,並將Gradle API添加爲編譯時依賴項,build工程,會在External Libraries中生成三個jar文件:
這樣咱們能夠在非buildSrc工程項目中使用groovy語法和Gradle的api了。 建立自定義插件 在src/main/groovy/ 目錄中建立一個包,個人是com.example.plugins,在com.example.plugins建立一個groovy文件: src/main/groovy/com/example/plugins/CustomPlugin.groovy
package com.example.plugins
import org.gradle.api.Plugin
import org.gradle.api.Project
class CustomPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.task('CustomPluginTask') {
doLast {
println "自定義插件"
}
}
}
}
複製代碼
配置properties文件
在buildSrc工程項目中,Gradle能夠自動的去識別插件,獨立項目中的插件是如何被Gradle識別的呢?答案是須要在生成的JAR文件中提供一個屬性文件,這個屬性文件名要與插件id相匹配。在resources中建立src/main/resources/META-INF/gradle-plugins/com.example.plugins.customplugin.properties,這個屬性文件的名稱實際就是插件的id。將properties文件的內容改成:
src/main/resources/META-INF/gradle-plugins/com.example.plugins.properties
implementation-class=com.example.plugins.CustomPlugin
複製代碼
implementation-class屬性爲自定義插件的名稱。
上傳插件
這裏爲了方便舉例直接將插件上傳到本地,若是想要發佈到Maven、ivy等倉庫,見下面的文檔: docs.gradle.org/4.4/usergui… docs.gradle.org/4.4/usergui… 想要發佈到Gradle插件門戶上,見下面的文檔: docs.gradle.org/4.4/usergui… 在build.gradle文件中添加以下內容:
apply plugin: 'maven'
group = 'com.example.plugins'
version = '1.0.0'
uploadArchives {
repositories {
mavenDeployer {
repository(url: uri('../repo'))
}
}
}
複製代碼
這段代碼會將生成的插件上傳到項目的平級目錄repo下。定義了group和version的名稱,這些值會在其餘項目依賴該插件時用到。咱們Build後會在Gradle窗口中看到uploadArchives,以下圖所示。
新建一個Groovy項目,我取名爲Projet,build.gradle的代碼以下:
apply plugin: 'com.example.plugins.customplugin'
buildscript {
repositories {
maven {
url uri('../repo') } } dependencies {
classpath 'com.example.plugins:CustomPluginShare:1.0.0'
}
}
複製代碼
其中com.example.plugins是group,CustomPluginShare是自定義插件的名稱,1.0.0是版本號,也能夠這麼寫:
dependencies {
classpath group: 'com.example.plugins', name: 'CustomPluginShare',
version: '1.0.0'
}
複製代碼
Terminal中輸入gradlew.bat CustomPluginTask來執行CustomPluginTask任務,大功告成。 若是咱們將自定義插件發佈到Gradle插件門戶上,就能夠使用插件DSL了:
build.gradle
plugins {
id 'com.example.plugins.customplugin' version '1.0.0'
}
複製代碼
雖然講解獨立項目的例子超級簡單,但我仍是將代碼上傳到GitHub上了,也許會有同窗用的上: github.com/henrymorgen…
本篇文章介紹了自定義Gradle插件的3種方式,旨在以最簡單的例子來讓你們快速掌握,若是還想了解複雜的自定義插件能夠去查看一些開源的Gradle插件,或者在工做中去實踐。本篇文章也爲學習Android Gradle插件打下了伏筆。
不只分享大前端、Java、Android、跨平臺等技術,還有大廠乾貨和程序員成長類文章。