前面幾篇學習了 Gradle 構建任務的基礎知識,了解了 Project 和 Task 這兩個概念,建議先閱讀前面幾篇文章:
Gradle 內置了很多常用的插件,Gradle 中的插件可在一定的場景中可以幫助我們提高開發效率,可以通過擴展現有的插件來實現更多功能,比如 Android Gradle 插件就是基於內置的 Java 插件來實現的。
- 插件的作用
- 如何應用一個插件
- 自定義插件
插件的作用#
先來一下 Gradle 插件的作用,主要有以下幾個方面:
- 添加任務到項目中,可對項目進行測試、編譯、打包;
- 添加依賴到項目中,可用來配置項目構建過程中需要的依賴;
- 可以向項目中現有的對象類型添加新的擴展屬性、方法等,可方便項目的配置和構建優化,比如 Android 項目構建中的 android {} 就是 Android Gradle 插件為 Project 對象添加的一個擴展;
- 可以對項目進行一些約定,如使用 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 包,然後就可以在其他項目中使用了,下面來一張自定義插件項目目錄截圖:
最後,在構建項目中使用該插件,複製插件到某個項目中,如複製到項目中的 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 插件的使用。