Gradle核心思想(六)自定義Gradle插件的三種方式

本文首發於微信公衆號「劉望舒」html

相關文章
Gradle核心思想(一)爲何如今要用Gradle?
Gradle核心思想(二)Gradle入門前奏
Gradle核心思想(三)Groovy快速入門指南
Gradle核心思想(四)看似無用,實則重要的Gradle Wrapper
Gradle核心思想(五)通俗易懂的Gradle插件講解前端

前言

在上一篇文章Gradle核心思想(五)通俗易懂的Gradle插件講解中,我介紹了什麼是Gradle插件、如何使用Gradle插件、Gradle插件的做用和好處,因爲篇幅的緣由,還有一個重要的知識點沒有講,那就是自定義Gradle插件(自定義Gradle對象插件)。自定義Gradle插件主要有三種方式,分別是build.gradle中編寫、buildSrc工程項目中編寫、獨立項目中編寫。建議閱讀本文前,先閱讀開頭列出的本系列相關文章。java

1.build.gradle

對象插件是實現了org.gradle.api.plugins接口的插件,這個接口中只定義個一個簡單的apply方法,想要實現自定義插件就須要去實現org.gradle.api.plugins接口。 Groovy、Java、Kotlin均可以做爲實現插件的語言,在本文的示例中,使用Groovy做爲實現語言。 在實際工做中咱們不多會在build.gradle中編寫自定義插件,這裏是爲了帶你們寫個最簡單的例子,能夠最快最直接的瞭解什麼是自定義插件。git

1.1 簡單的自定義插件

這裏使用IntelliJ來編輯(AS也能夠),首先新建一個Groovy工程: 程序員

定義項目的GroupId和ArtifactId: github

3.png

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任務。 微信

1.2 自定義插件擴展

再舉一個簡單的插件拓展例子,經過插件拓展來配置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

2.buildSrc工程項目

除了在build.gradle中編寫的自定義插件,還能夠將插件的源代碼放在rootProjectDir/buildSrc/src/main/groovy目錄中,Gradle會自動識別來完成編譯和測試。 在第一節的工程根目錄下創建/buildSrc/src/main/groovy目錄,以下圖所示。

在groovy目錄中建立一個groovy文件,好比個人是CustomPlugin.groovy: buildSrc/src/main/groovy/CustomPlugin.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任務,會打印出咱們想要的結果。

3.獨立項目

不管是在build.gradle中編寫自定義插件,仍是buildSrc項目中編寫自定義插件,都只能在本身的項目中進行使用。若是想要分享給其餘人或者本身用,能夠在一個獨立的項目中編寫插件,這個項目會生成一個包含插件類的JAR文件,有了JAR文件就很容易進行分享了。

3.1 自定義插件

爲了和前兩種方式進行區分,用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,以下圖所示。

點擊uploadArchives會在本地生成插件相關的文件,好比個人目錄和文件以下圖所示。
圖中的CustomPluginShare-1.0.0.rar就是咱們須要的插件jar包。

3.2 在另外一個項目中使用插件

新建一個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、跨平臺等技術,還有大廠乾貨和程序員成長類文章。

相關文章
相關標籤/搜索