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

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

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

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

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

1 插件的作用

1.1 插件會擴展項目的功能拴袭,幫助我們在項目的構(gòu)建中做很多事情:
(1) 可以在項目中添加任務(wù)麻献,比如測試、編譯世落、打包。
(2) 可以在項目中添加依賴配置糟需,實現(xiàn)項目在構(gòu)建過程中的依賴屉佳。比如依賴的第三方庫。
(3) 可以向項目中現(xiàn)有的對象類型添加新的擴展屬性洲押、方法等武花。可以使用它們幫助我們配置杈帐、優(yōu)化構(gòu)建体箕。比如 AndroidStudio 中 android{} 這個配置塊就是 Android Gradle 插件為 Project 對象添加的一個擴展专钉。
(4) 可以對項目進行一些約定,比如應(yīng)用 Java 插件之后累铅, 約定 src/main/java 目錄下是源代碼的位置跃须,在編譯的時候也是編譯這個目錄下的 Java 源碼文件。

1.2 對于插件娃兽,只需要按照它約定的方式菇民,使用它提供的任務(wù)、方法或者擴展投储,就可以對項目進行構(gòu)建第练。

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

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

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

2.1.1 二進制插件就是實現(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 是默認導(dǎo)入的,所以可以去掉包名直接寫為:

apply plugin:JavaPlugin

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

2.1.3 二進制插件一般都是被打包成 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)用插件腳本蟹但,就是把這個腳本加載進來躯泰。和二進制插件不同的是它使用的是 from 關(guān)鍵字,后面緊跟一個腳本文件矮湘。這個腳本文件可以是本地的斟冕,也可以是網(wǎng)絡(luò)的口糕,如果是網(wǎng)絡(luò)上的則要使用 HTT PURL缅阳。

2.2.3 雖然它不是一個真正的插件,但是也有很大的作用景描。它是腳本文件模塊化的基礎(chǔ)十办,可以把內(nèi)容很多的腳本文件進行分塊、分段整理超棺,拆分成一個個共用向族、職責(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 對象的方法夜矗、屬性等進行配置。

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 包的二進制插件让虐,在應(yīng)用的時候紊撕,必須先在 buildscript{} 里配置其 classpath 才能使用,不像 Gradle 內(nèi)置的插件赡突。比如在 AndroidStudio 中:
buildscript

2.4.2 buildscript{} 塊是一個在構(gòu)建項目之前对扶,為項目進行前期準備和初始化相關(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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赴穗,隨后出現(xiàn)的幾起案子憔四,更是在濱河造成了極大的恐慌膀息,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件了赵,死亡現(xiàn)場離奇詭異潜支,居然都是意外死亡,警方通過查閱死者的電腦和手機柿汛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門冗酿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人络断,你說我怎么就攤上這事裁替。” “怎么了貌笨?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵弱判,是天一觀的道長。 經(jīng)常有香客問我锥惋,道長昌腰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任膀跌,我火速辦了婚禮遭商,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淹父。我一直安慰自己株婴,他們只是感情好,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布暑认。 她就那樣靜靜地躺著困介,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蘸际。 梳的紋絲不亂的頭發(fā)上座哩,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機與錄音粮彤,去河邊找鬼根穷。 笑死,一個胖子當著我的面吹牛导坟,可吹牛的內(nèi)容都是我干的屿良。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼惫周,長吁一口氣:“原來是場噩夢啊……” “哼尘惧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起递递,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤喷橙,失蹤者是張志新(化名)和其女友劉穎啥么,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贰逾,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡悬荣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了疙剑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氯迂。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖核芽,靈堂內(nèi)的尸體忽然破棺而出囚戚,到底是詐尸還是另有隱情酵熙,我是刑警寧澤轧简,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站匾二,受9級特大地震影響哮独,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜察藐,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一皮璧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧分飞,春花似錦悴务、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至染服,卻和暖如春别洪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柳刮。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工挖垛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秉颗。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓痢毒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蚕甥。 傳聞我的和親對象是個殘疾皇子哪替,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

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