1. 前言
自定義Gradle Plugin使用的是Groovy語言,和Java很像,很容易理解,不做過多的語言介紹。
2. Gradle Plugin的位置
直接在構建文件build.gradle中編寫Plugin,這種方法寫的Plugin無法被其他構建文件引用
單獨寫Gradle Plugin文件,放在rootProjectDir/buildSrc/src/main/groovy/目錄下,同一個工程中所有的構建文件夠可以引用這個插件,但是不能被其他工程引用
單獨的工程中自定義Gradle Plugin,上傳到遠端maven庫等,其他工程通過添加依賴,引用這個插件
3. 簡單的Gradle Plugin示例
自定義插件,需要實現Plugin接口。在其他工程的構建文件中通過Plugin.apply(T)方法引用插件,這個工程會被當作參數傳入。上面講了Gradle Plugin可能存在的三種位置,下面是一個簡單插件的示例,是直接寫在build.gradle的。
apply plugin: DemoPlugin
// 其他一些工程的配置信息
...
class DemoPlugin implements Plugin<Project> {
void apply(Project project) {
project.task('hello') {
doLast {
println "Hello World from the DemoPlugin"
使用gradle -q hello指令輸出如下:
> gradle -q hello
Hello World from the DemoPlugin
因為這個Gradle Plugin是直接寫在構建文件build.gradle里的,所以它不能被其他構建文件引用,下面介紹可被其他工程引用的自定義插件。
4. 自定義插件
想要可以被其他工程引用我們自定義的Gradle Plugin,需要將Gradle Plugin上傳到maven等遠端庫,因為是demo,就將插件發布到本地。一般來說有下面幾步。
在rootProjectDir/buildSrc/src/main/groovy/目錄下創建插件,並實現具體內容
在rootProjectDir/buildSrc/src/main/resources/META-INF/gradle-plugins目錄下創建屬性文件聲明插件的具體實現類,屬性文件的名稱和Gradle Plugin Id相匹配,內容是implementation-class=具體實現類全稱
上傳mavan等庫,這篇文章就不上傳到maven庫,將插件發布到本地
其他工程引用插件
4.1 插件具體實現類
目錄結構如下:
圖-1 插件目錄結構圖
插件類具體內容如下:
package com.spi.demo.gradle
import org.gradle.api.Plugin
import org.gradle.api.Project
public class DemoPlugin implements www.sb45475.com Plugin<Project> {
void apply(Project project) {
project.task('hello') {
doLast {
println "Hello World from the DemoPlugin"
}
}
}
可以看出其實和Java文件差別不大,這個插件主要申明了一個名為hello的任務,這個任務只輸出一句話。
實現了Gradle Plugin的具體實現類后,在/buildSrc/src/main/resources/目錄下創建屬性文件聲明Gradle Plugin的具體實現類的位置。屬性文件的名稱是.propertires,內容是具體實現類的位置,這個demo中屬性文件的內容如下:
implementation-class=com.www.yuheng119.com spi.demo.gradle.DemoPlugin
1
1
4.2 插件Id
插件Id是自定義的,聲明插件Id后,其他工程在構建文件build.gradle中通過apply plugin: 'Plugin Id'來引用具體的Gradle Plugin。
插件id類似於java中的包名,可以避免與其他插件發生沖突。
插件id最好是組件命名空間和插件名稱的結合,例如,如果有一個名為“foo”的Github賬戶,他插件被命名為“bar”,插件id可以是com.github.foo.bar。同樣,如果一個叫做baz的插件開發組織,插件id可以是org.baz.bar插件。
插件id遵從一下規則:
可以包含任何字母和數字,以及“.”和“-”字符
必須包含至少一個“.”字符
只能使用小寫字母
org.gradle和com.gradleware不能被使用
不能以“.”字符開始或者結束
不能連續使用“.”字符
盡管插件id和Java包名有些相似,但實際上包名比插件id要詳細得多。
4.3 發布插件
在gradle文件或者pom文件引入一個庫,需要有groupId、artifactId、version三個屬性,根據這三個屬性來區分找到唯一的庫。
例如:
compile 'com.android.support:appcompat-v7:25.3.1'
1
1
這個引用中
com.android.support是groupId
appcompat-v7是artifactId
25.3.1是version。
同樣,在發布插件時候,也需要這三個屬性,用於和其他插件做出區分。
在build.gradle文件內容如下,添加上傳任務:
apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
compile gradleApi()
compile www.lieqibiji.com localGroovy()
}
group = 'com.spi.demo'
version = '1.0-SNAPSHOT'
uploadArchives {
repositories {
mavenDeployer {
repository(url: uri('../repo'))
}
}
在這里,定義了group和version,但是沒有定義artifact,這是因為artifact默認是這個工程目錄名稱,這個demo中artifact就是plugin。
在uploadArchives任務中,我們將插件發布到本工程的上一層目錄的repo文件夾中。執行這個任務后,插件會被發布,發布后目錄結構如下圖。
圖-2 本地插件目錄結構圖
可以直接在終端使用指令執行uploadArchives任務,可以將plugin目錄工程設置成module,使用Android Studio執行任務。
圖-3 上傳插件任務圖
4.4 引用插件
在工程的構建文件build.gradle中添加依賴,引用插件。
apply plugin: 'com.spi.demo'
buildscript {
repositories {
maven {
url uri('../repo')
}
}
dependencies {
classpath 'com.www.jpg521.com spi.www.wmyl11.com/demo:plugin:1.0-SNAPSHOT'
}
添加了構建的依賴庫路徑,配置了依賴的具體插件名稱。然后在任務列表中就可以看見名為hello的任務。
圖-4 引入插件任務圖
使用gradle -q hello指令輸出如下:
> gradle -q hello
Hello World from the DemoPlugin
5. 總結
本文沒有講解將插件發布到遠端,插件可以發布到lvy倉庫、maven倉庫、Gradle plugin portal三個地方。
發布到lvy倉庫的教程參考點擊進入詳情
發布到maven倉庫的教程參考點擊進入詳情
發布到Gradle plugin portal教程參考點擊進入詳情,想要搜索Gradle plugin portal中有哪些插件,查看這里點擊進入詳情