Gradle系列之Gradle插件

原文發於微信公衆號 jzman-blog,歡迎關注交流。

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

本篇文章主要介紹 Gradle 插件,Gradle 內置了不少經常使用的插件,Gradle 中的插件可在必定的場景中能夠幫助咱們提升開發效率,能夠經過擴展示有的插件來實現更多功能,好比 Android Gradle 插件就是基於內置的 Java 插件來實現的。android

  1. 插件的做用
  2. 如何應用一個插件
  3. 自定義插件

插件的做用

先來一下 Gradle 插件的做用,主要有如下幾個方面:api

  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 的惟一性。app

腳本插件的使用

腳本插件的使用實際上就是某個腳本文件的使用,使用腳本插件時將腳本加載進來就能夠了,使用腳本插件要使用到關鍵字 from,後面的腳本文件能夠是本地的也能夠是網絡上的腳本文件,下面定義一段腳本,咱們在 build.gradle 文件中使用它,具體以下:ide

//version.gradle文件
ext{
    versionName = "1.0"
    versionCode = 1
}

下面將將在構建文件中使用這個腳本文件,具體以下:工具

//build.gradle文件
apply from: 'version.gradle'

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

上述代碼的執行結果以下:post

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

相關文章
相關標籤/搜索