Gradle系列之Gradle外掛

躬行之發表於2020-08-21
原文發於微信公眾號 jzman-blog,歡迎關注交流。

前面幾篇文章學習了 Gradle 基礎知識、Groovy 以及 Gradle 任務,可以先閱讀前面幾篇文章瞭解 Gradle 相關知識:

本篇文章主要介紹 Gradle 外掛,Gradle 內建了很多常用的外掛,Gradle 中的外掛可在一定的場景中可以幫助我們提高開發效率,可以透過擴充套件現有的外掛來實現更多功能,比如 Android Gradle 外掛就是基於內建的 Java 外掛來實現的。

  1. 外掛的作用
  2. 如何應用一個外掛
  3. 自定義外掛

外掛的作用

先來一下 Gradle 外掛的作用,主要有以下幾個方面:

  1. 新增任務到專案中,可對專案進行測試、編譯、打包;
  2. 新增依賴到專案中,可用來配置專案構建過程中需要的依賴;
  3. 可以向專案中現有的物件型別新增新的擴充套件屬性、方法等,可方便專案的配置和構建最佳化,比如 Android 專案構建中的 android{} 就是 Android Gradle 外掛為 Project 物件新增的一個擴充套件;
  4. 可以對專案進行一些約定,如使用 Java Gradle 外掛可以約定 src/main/java 目錄下原始碼的存放位置,在編譯的時候就可以編譯指定目錄下的 Java 原始碼檔案。

如何應用一個外掛

在使用一個外掛之前要先使用 Project 的 apply 方法來應用該外掛,外掛分為二進位制外掛和指令碼外掛。

二進位制外掛的使用

二進位制外掛就是實現了 org.gradle.api.Plugin 介面的外掛,每個 Java Gradle 外掛都有一個 plugin id,可以透過如下方式使用一個 Java 外掛:

apply plugin : 'java'

透過上述程式碼就將 Java 外掛應用到我們的專案中了,其中 java 是 Java 外掛的 plugin id,對於 Gradle 自帶的核心外掛都有唯一的 plugin id,這裡的 java 對應的具體型別是 org.gradle.api.plugins.JavaPlugin,所以可以使用如下方式使用 Java 外掛:

apply.plugin:org.gradle.api.plugins.JavaPlugin
//org.gradle.api.plugins預設匯入
apply.plugin:JavaPlugin

二進位制外掛一般是打包在一個 Jar 中釋出的,如自定義外掛的時候在釋出的時候要指定外掛的 Plugin id,這個 plugin id 必須是唯一的,可使用應用包名來保證 plugin id 的唯一性。

指令碼外掛的使用

指令碼外掛的使用實際上就是某個指令碼檔案的使用,使用指令碼外掛時將指令碼載入進來就可以了,使用指令碼外掛要使用到關鍵字 from,後面的指令碼檔案可以是本地的也可以是網路上的指令碼檔案,下面定義一段指令碼,我們在 build.gradle 檔案中使用它,具體如下:

//version.gradle檔案
ext{
    versionName = "1.0"
    versionCode = 1
}

下面將將在構建檔案中使用這個指令碼檔案,具體如下:

//build.gradle檔案
apply from: 'version.gradle'

task taskVersion{
    doLast{
        println "版本是${versionName},版本號是${versionCode}"
    }
}

上述程式碼的執行結果如下:

PS E:\Gradle\study\GradlePlugin> gradle taskVersion

> Task :taskVersion
版本是1.0,版本號是1


BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed

顯然,透過 apply from 引用到外掛指令碼了,指令碼外掛的使用可將構建使用的指令碼檔案分段整理,可將指令碼檔案分離成職責分明的單個指令碼檔案,然後直接使用 apply from 關鍵字來使用這些指令碼檔案,如可將某些工具性質的方法以及各個依賴使用的版本號分別定義到單個 gradle 檔案中,方便統一呼叫和管理各個依賴的版本號等。

apply方法的用法

Project.apply() 可以接收三種不同的引數,具體如下:

//閉包作為引數
void apply(Closure closure);
//配置一個ObjectConfigurationAction
void apply(Action<? super ObjectConfigurationAction> action);
//Map作為引數
void apply(Map<String, ?> options);

使用上面三種方式可以配置一個外掛,三種方式的寫法如下:

//Map作為引數
apply plugin:'java'
//閉包作為一個引數
apply{
    plugin 'java'
}
//配置一個ObjectConfigurationAction
apply(new Action<ObjectConfigurationAction>() {

    @Override
    void execute(ObjectConfigurationAction objectConfigurationAction) {
        objectConfigurationAction.plugin('java')
    }
})
使用第三方釋出的外掛

大多時候需要第三方的外掛來構建專案,使用的時候必須要在 buildscript{} 裡配置 classpath 才能使用,如 Android Gradle 外掛使用的時候就需要在 buildgradle{} 裡面配置對應的 classpath,程式碼參考如下:

buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
    }
}

buildscript{} 塊主要是在專案構建之前配置好專案構建的相關依賴,配置好這些依賴就可以透過如下方式使用外掛了:

//使用時必須先在buildscript{}中配置相應的classpath
apply plugin: 'com.android.application'
使用plugins DSL應用外掛

plugins DSL 是一種新的外掛的應用方式,這種方式只能在 Gradle 2.1 以上才可以使用,使用方式參考如下:

//plugins DSL 方式
plugins{
    id 'java'
}
//如果第三方外掛託管到https://plugins.gradle.org/,就不用在
//buildscript中配置classpath了
plugins{
    id "外掛id" version '外掛版本號'
}

關於外掛的使用就到此為止。

自定義外掛

大多時候需要自定義外掛來完成一些專案的構建操作,自定義外掛必須實現 Plugin 介面,介面中的 apply 方法會在外掛被應用的時候執行,可實現該方法在裡面進行相關操作,下面使用 Android Studio 來進行一個簡單外掛的開發,外掛的作用建立一個任務,這裡主要藉助 Android Studio 來建立一個 Groovy 工程,然後進行相關程式碼的開發。

在 Android Studio 中建立一個 Module , 刪除出 src/main、build.gradle 以外的其他檔案,然後建立一個 .groovy 檔案實現 Plugin 介面,檔案內容如下:

package com.manu.plugin

import org.gradle.api.Plugin
import org.gradle.api.Project

/**
 * 自定義外掛
 */
class MPlugin implements Plugin<Project>{

    @Override
    void apply(Project target) {
        target.task('taskPlugin')  {
            doLast {
                println "自定義外掛建立任務"
            }
        }
    }
}

然後,指定該外掛的 plugin id,在 src/main 下面建立 resources/META-INF/gradle-plugins 目錄,然後建立一個帶有 plugin id 的 properties 檔案,檔案內容如下:

//指定外掛具體實現類
implementation-class=com.manu.plugin.MPlugin

下面是 build.gradle 檔案對應的配置參考如下:

apply plugin: 'groovy'

dependencies {
    //gradle sdk
    compile gradleApi()
    //groovy sdk
    compile localGroovy()
}

可以說一個簡單的外掛就定義好了,為了方便實用將該外掛專案生成 jar 包,然後就可以在其他專案中使用了,下面來一張自定義外掛專案目錄截圖:

image.png

最後,在構建專案中使用該外掛,複製外掛到某個專案中,如複製到專案中的 libs 資料夾中,指定外掛的 classpath ,使用 apply 方法使用外掛即可:

apply plugin: 'com.manu.plugin'

buildscript{
    dependencies{
        classpath files('libs/plugin.jar')
    }
}

上述程式碼的執行結果如下:

PS E:\Gradle\study\GradlePlugin> gradle taskPlugin

> Task :taskPlugin
自定義外掛建立任務


BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed

因為外掛建立了任務 taskPlugin,所以可以使用該任務,外掛的基本使用如上所述,接下來將會繼續學習 Java Gradle 外掛的使用。可以關注公眾號:jzman-blog,一起交流學習。

image

相關文章