Gradle 插件 -- 插件的應(yīng)用

----《Android Gradle 權(quán)威指南》學(xué)習(xí)筆記

總目錄:Gradle 學(xué)習(xí)系列 -- 目錄

上一篇:Gradle 任務(wù) -- 任務(wù)規(guī)則

下一篇:Gradle 插件 -- 自定義插件

1 插件的作用

1.1 插件會擴(kuò)展項目的功能,幫助我們在項目的構(gòu)建中做很多事情:
(1) 可以在項目中添加任務(wù),比如測試、編譯、打包。
(2) 可以在項目中添加依賴配置,實現(xiàn)項目在構(gòu)建過程中的依賴。比如依賴的第三方庫。
(3) 可以向項目中現(xiàn)有的對象類型添加新的擴(kuò)展屬性、方法等??梢允褂盟鼈儙椭覀兣渲?、優(yōu)化構(gòu)建。比如 AndroidStudio 中 android{} 這個配置塊就是 Android Gradle 插件為 Project 對象添加的一個擴(kuò)展。
(4) 可以對項目進(jìn)行一些約定,比如應(yīng)用 Java 插件之后, 約定 src/main/java 目錄下是源代碼的位置,在編譯的時候也是編譯這個目錄下的 Java 源碼文件。

1.2 對于插件,只需要按照它約定的方式,使用它提供的任務(wù)、方法或者擴(kuò)展,就可以對項目進(jìn)行構(gòu)建。

2 應(yīng)用一個插件

在使用一個插件之前需要先應(yīng)用它,把它應(yīng)用到項目中,這樣就可以使用它了。
插件的應(yīng)用都是通過 Project.apply() 方法完成的,apply() 方法有好幾種用法,并且插件也分為二進(jìn)制插件和腳本插件。

2.1 應(yīng)用二進(jìn)制插件

2.1.1 二進(jìn)制插件就是實現(xiàn)了 org.gradle.api.Plugin 接口的插件,它們可以有 plugin.id。

2.1.2 舉個例子:

apply plugin:'java'

上面的語句把 Java 插件應(yīng)用到了項目中,其中 'java' 是 Java 插件的 plugin id,它是唯一的。對于 Gradle 自帶的核心插件都有一個容易記憶的名稱,稱為 plugin id,比如上面的 java。其實它對應(yīng)的類型是 org.gradle.api.plugins.JavaPlugin。所以也可以寫成:

apply plugin: org.gradle.api.plugins.JavaPlugin

又因為包 org.gradle.api.plugins 是默認(rèn)導(dǎo)入的,所以可以去掉包名直接寫為:

apply plugin:JavaPlugin

上面的3中寫法是等價的,因為第一種容易記憶,所以用的比較多。第二種寫法一般適用于在 build 文件中自定義的插件,也就是腳本插件。

2.1.3 二進(jìn)制插件一般都是被打包成 jar 文件獨立發(fā)布的,比如自定義的插件,在發(fā)布的時候可以為其指定 plugin id。 這個 plugin id 最好是一個全限定名稱,就像包名一樣,這樣發(fā)布的插件 plugin id 就不會重發(fā)。

2.2 應(yīng)用腳本插件

2.2.1 比如在項目根目錄下有以下兩個 gradle 文件:
build.gradle:

apply from:'version.gradle'

task testVersion{
    doLast{
        println "APP 版本是: ${versionName}, 版本號是:${versionCode}"
    }
}

version.gradle:

ext{
    versionName = "APP1.0.1"
    versionCode = 1.0
}

在命令行中執(zhí)行命令:gradle testVersion
打印結(jié)果:

> Task :testVersion
APP 版本是: APP1.0.1, 版本號是:1.0

2.2.2 其實上面的 version.gradle 算不上一個插件,它只是一個腳本。應(yīng)用插件腳本,就是把這個腳本加載進(jìn)來。和二進(jìn)制插件不同的是它使用的是 from 關(guān)鍵字,后面緊跟一個腳本文件。這個腳本文件可以是本地的,也可以是網(wǎng)絡(luò)的,如果是網(wǎng)絡(luò)上的則要使用 HTT PURL。

2.2.3 雖然它不是一個真正的插件,但是也有很大的作用。它是腳本文件模塊化的基礎(chǔ),可以把內(nèi)容很多的腳本文件進(jìn)行分塊、分段整理,拆分成一個個共用、職責(zé)分明的文件,然后通過 apply from 來使用它們。比如可以把常用的函數(shù)放在一個 util.gradle 文件中。

2.3 apply() -- 閉包的方式

2.3.1 Project.apply() 方法有3中用法,它們接受不同的參數(shù):

// apply 方法
void apply(Map<String, ?> options);
void apply(Closure closure);
void apply(Action<? super ObjectConfigurationAction> action);

閉包的方式如下:

apply{
    plugin 'java'
}

該閉包被用來配置一個 ObjectConfigurationAction 對象,所以可以在閉包里面使用 ObjectConfigurationAction 對象的方法、屬性等進(jìn)行配置。

2.3.2 舉個栗子:

apply(new Action<ObjectConfigurationAction>() {
    @Override
    void execute(ObjectConfigurationAction objectConfigurationAction) {
        objectConfigurationAction.plugin('java')
    }
})

2.4 應(yīng)用第三方發(fā)布的插件

2.4.1 第三方發(fā)布的一般都是 jar 包的二進(jìn)制插件,在應(yīng)用的時候,必須先在 buildscript{} 里配置其 classpath 才能使用,不像 Gradle 內(nèi)置的插件。比如在 AndroidStudio 中:
buildscript

2.4.2 buildscript{} 塊是一個在構(gòu)建項目之前,為項目進(jìn)行前期準(zhǔn)備和初始化相關(guān)配置依賴的代碼塊。配置好需要的依賴,就可以在項目中應(yīng)用插件了:

plugins {
    id 'com.android.application'
}

如果沒有提前在 buildscript{} 里配置依賴的 classpath,會提示找不到這個插件。

2.4.3 根據(jù)上面的內(nèi)容:
(1) 如果在 AndroidStudio 的根目錄的 build.gradle 文件中的 buildscript{} 塊中注釋掉
classpath "com.android.tools.build:gradle:7.0.4" 這一行,則構(gòu)建時,則在 app 目錄下的 build.gradle 文件中 id 'com.android.application' 這一行會報錯

(2) 如果在 app 目錄下的 build.gradle 文件中注釋掉 id 'com.android.application' 這一行,則代碼塊 android{}會報錯

2.5 通過 plugin DSL 應(yīng)用插件

plugin DSL 是一種比較新的插件應(yīng)用方式,具體的格式為:

plugins {
    id 'java'
}

這樣就應(yīng)用了 java 插件,看著更簡潔一些,更符合 DSL 規(guī)范。現(xiàn)在 IDE 中都是這種方式了。

相關(guān)代碼:https://gitee.com/fzq.com/gradle-demos
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Gradle 本身只提供基本框架和核心概念,幾乎所有的功能都是以插件的方式提供的。 例如構(gòu)建 Java 應(yīng)用的功能...
    佛系編碼閱讀 508評論 0 0
  • 說起Gradle的插件,不得不感嘆Gradle的設(shè)計。Gradle的設(shè)計非常好,它本身提供一些基本的概念和整體核心...
    acc8226閱讀 947評論 0 2
  • 探討Gradle插件的自定義有助更好的理解Gradle,本文綜合了userguide中的幾篇相關(guān)文檔,將不單獨給出...
    cntlb閱讀 2,617評論 0 7
  • 個人博客:http://www.milovetingting.cn Gradle插件 插件的作用 把插件應(yīng)用到項目...
    milovetingting閱讀 947評論 0 1
  • 點贊關(guān)注,不再迷路,你的支持對我意義重大!?? Hi,我是丑丑。本文 「Android 路線」| 導(dǎo)讀 —— 從零到...
    彭旭銳閱讀 2,067評論 1 8

友情鏈接更多精彩內(nèi)容