Gradle核心思想(五)通俗易懂的Gradle插件講解

本文首發(fā)于 公眾號(hào) 劉望舒
關(guān)聯(lián)文章
Gradle核心思想(一)為什么現(xiàn)在要用Gradle殃姓?
Gradle核心思想(二)Gradle入門前奏
Gradle核心思想(三)Groovy快速入門指南
Gradle核心思想(四)看似無(wú)用,實(shí)則重要的Gradle Wrapper
Gradle核心思想(五)通俗易懂的Gradle插件講解

前言

在本系列的前作中姐赡,我們學(xué)習(xí)了為什么要用Gradle、Gradle的入門基礎(chǔ)和Groovy的基礎(chǔ)囱稽,這些文章為Gradle的入門打下了基礎(chǔ),這一篇我們要來學(xué)習(xí)Gradle的插件。

1.Gradle插件概述

說到Gradle插件前棒假,我們先要了解下什么是插件。在Android進(jìn)階三部曲第二部《Android進(jìn)階解密》一書中精盅,我為了講解插件化的原理帽哑,講解了什么是插件,我們先來看看下面這張圖渤弛。



可以看到初始的機(jī)器人只有照相祝拯、地圖甚带、瀏覽器她肯、計(jì)算機(jī)等功能,這顯然是比較乏味的鹰贵,我們可以給這個(gè)機(jī)器人安裝很多其他的應(yīng)用晴氨,使它提供更多的功能,如下圖所示

我們給這個(gè)機(jī)器人安裝了很多應(yīng)用碉输,這些應(yīng)用不僅覆蓋了人的衣食住行還提供了娛樂功能籽前,我們可以玩游戲、聽音樂和購(gòu)物等等敷钾,機(jī)器人也得到了極大的提升枝哄,能夠購(gòu)為人類提供更多的服務(wù)。這些安裝的應(yīng)用可以理解為插件阻荒,這個(gè)插件可以自由的進(jìn)行插拔挠锥,比如我們需要玩游戲時(shí)可以安裝王者榮耀,如果不好玩就把它卸載掉侨赡。這么說來其實(shí)Android蓖租、iOS、Mac等操作系統(tǒng)采用的都是這種思想羊壹,而Gradle也是如此蓖宦。
Gradle本身和初始的機(jī)器人一樣,只是提供了基本的核心功能油猫,其他的特性比如編譯Java源碼的能力稠茂,編譯Android工程的能力等等就需要通過插件來實(shí)現(xiàn)了。本篇文章主要說的是Gradle插件情妖,而不是Android Gradle插件睬关。

2.應(yīng)用Gradle插件

要想應(yīng)用插件嚣州,主要有兩個(gè)步驟,一是解析插件共螺,二是把插件應(yīng)用到項(xiàng)目中该肴,應(yīng)用插件通過 Project.apply() 方法來完成。
在Gradle中一般有兩種類型的插件藐不,分別叫做腳本插件和對(duì)象插件匀哄。腳本插件是額外的構(gòu)建腳本,它會(huì)進(jìn)一步配置構(gòu)建雏蛮,可以把它理解為一個(gè)普通的build.gradle涎嚼。對(duì)象插件又叫做二進(jìn)制插件,是實(shí)現(xiàn)了Plugin接口的類挑秉,下面分別介紹如何使用它們法梯。

2.1 腳本插件

在上一篇文章Gradle核心思想(四)看似無(wú)用,實(shí)則重要的Gradle Wrapper的例子基礎(chǔ)上犀概,定義一個(gè)other.gradle立哑,例子的目錄結(jié)構(gòu)是如下圖所示。

other.gradle

ext{
verson='1.0'
url='http://liuwangshu.cn'
}

這實(shí)際上不算是一個(gè)真正的腳本插件姻灶,就是一個(gè)簡(jiǎn)單的腳本铛绰,主要是用于演示腳本插件是如何被應(yīng)用的。我們?cè)赽uild.gradle中來應(yīng)用這個(gè)插件:
build.gradle

apply from: 'other.gradle'
task test {
    doLast {
        println "版本為:${verson},地址為:${url}"
    }
}

apply是Gradle project中提供的方法产喉,用于配置項(xiàng)目中的插件捂掰。執(zhí)行g(shù)radlew.bat test,會(huì)打印出想要的結(jié)果曾沈。

2.2 對(duì)象插件

我們知道對(duì)象插件就是實(shí)現(xiàn)了org.gradle.api.plugins<Project>接口的插件这嚣,對(duì)象插件可以分為內(nèi)部插件和第三方插件。

2.2.1 內(nèi)部插件

如果我們想要應(yīng)用Java插件可以這么寫:
build.gradle

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

Gradle默認(rèn)就導(dǎo)入了org.gradle.api.plugins包塞俱,因此我們也可以去掉包名:

apply plugin: JavaPlugin  

實(shí)現(xiàn)了org.gradle.api.plugins接口的插件會(huì)有pulginid姐帚,使用pulginid是最簡(jiǎn)潔、最常用的方式:

apply plugin: 'java'  

Gradle 的發(fā)行包中有大量的插件敛腌,這些插件有很多類型卧土,比如語(yǔ)言插件、集成插件像樊、軟件開發(fā)插件等等尤莺,如果我們想
向項(xiàng)目添加 c++ 源代碼編譯功能,可以這么寫:

apply plugin: 'cpp'  
2.2.2 第三方插件

第三方的對(duì)象插件通常是jar文件生棍,要想讓構(gòu)建腳本知道第三方插件的存在颤霎,需要使用buildscrip來設(shè)置。

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4"
  }
}
apply plugin: "com.jfrog.bintray"

在buildscrip中來定義插件所在的原始倉(cāng)庫(kù)和插件的依賴 ,再通過apply方法配置就可以了友酱。Android Gradle插件也屬于第三方插件晴音,如果我們想引入Android Gradle插件,可以這么寫:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.2'
    }
}
apply plugin: 'com.android.application'

這樣我們就可以使用Android Gradle插件缔杉,通過apply方法來使用App工程插件锤躁,這樣項(xiàng)目會(huì)編譯成為一個(gè)apk,這里涉及了Android相關(guān)的知識(shí)或详,脫離了本文的討論范圍系羞,具體的請(qǐng)見后續(xù)的Gradle for Android系列。

2.3 插件DSL

Gradle的特性有四種狀態(tài)霸琴,分別是Internal椒振、Incubating、Public梧乘、Deprecated澎迎,插件DSL屬于Incubating狀態(tài)(孵化狀態(tài))。
這也導(dǎo)致插件DSL的特性在將來的Gradle版本中可能會(huì)發(fā)生變化选调,直到它不再孵化為止夹供。
使用Java插件可以這么寫:
build.gradle

plugins {
    id 'java'
}

很簡(jiǎn)潔,當(dāng)然這是使用內(nèi)部插件学歧,如果外部插件被托管在https://plugins.gradle.org/罩引,也可以這樣寫:
build.gradle

plugins {
  id "com.jfrog.bintray" version "1.8.4"
}

不需要再配置buildscript了,直接配置plugins來使用插件枝笨。

2.4 自定義對(duì)象插件

對(duì)象插件是實(shí)現(xiàn)了org.gradle.api.plugins<Project>接口的插件,這個(gè)接口中只定義個(gè)一個(gè)簡(jiǎn)單的apply方法揭蜒,想要自定義插件就需要去實(shí)現(xiàn)org.gradle.api.plugins<Project>接口横浑。
來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的自定義插件,為了方便測(cè)試屉更,不再采用文本編輯徙融,而是使用IntelliJ來編輯(AS也可以),用IntelliJ來打開2.1小節(jié)的例子瑰谜,改寫build.gradle文件:
build.gradle

apply plugin:CustomPlugin
class CustomPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        project.task('CustomPluginTask') {
            doLast {
                println "自定義插件"
            }
        }
    }
}

在build.gradle中自定義了一個(gè)插件CustomPlugin欺冀,在apply方法中創(chuàng)建一個(gè)名稱為CustomPluginTask的任務(wù)。在IntelliJ的Terminal中輸入gradlew.bat CustomPluginTask來執(zhí)行CustomPluginTask任務(wù)萨脑。


這個(gè)例子只能在自己項(xiàng)目中使用隐轩,而且比較簡(jiǎn)單,更復(fù)雜的由于篇幅原因會(huì)在本系列的下一篇文章進(jìn)行介紹渤早。

3.Gradle插件的作用和好處

Gradle插件可以做什么呢职车?主要有以下的幾點(diǎn)

  • 為項(xiàng)目配置依賴。
  • 為項(xiàng)目配置約定,比如約定源代碼的存放位置悴灵。
  • 為項(xiàng)目添加任務(wù)扛芽,完成測(cè)試、編譯积瞒、打包等任務(wù)川尖。
  • 為項(xiàng)目中的核心對(duì)象和其他插件的對(duì)象添加拓展類型。

使用Gradle插件主要有以下的好處:

  • 重用和減少維護(hù)在多個(gè)項(xiàng)目類似的邏輯的開銷茫孔。
  • 更高程度的模塊化空厌。
  • 封裝必要的邏輯,并允許構(gòu)建腳本盡可能是聲明性地银酬。

總結(jié)

本篇的文章篇幅不長(zhǎng)嘲更,主要是沒有更多的介紹自定義對(duì)象插件,這個(gè)會(huì)在下一篇文章進(jìn)行介紹揩瞪「畴可能有的同學(xué)發(fā)現(xiàn)了,本系列的Gradle的文章都盡量不和Android和AS有所關(guān)聯(lián),為的是擺脫Android的束縛,Gradle本身就是一門技術(shù),當(dāng)我們了解了Gradle的核心思想后,再去學(xué)習(xí)Android Gradle時(shí)會(huì)有豁然開朗的效果。


分享大前端尚胞、Java、跨平臺(tái)等技術(shù),關(guān)注職業(yè)發(fā)展和行業(yè)動(dòng)態(tài)。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末皆串,一起剝皮案震驚了整個(gè)濱河市谤牡,隨后出現(xiàn)的幾起案子腊满,更是在濱河造成了極大的恐慌违诗,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疮蹦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡茸炒,警方通過查閱死者的電腦和手機(jī)愕乎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壁公,“玉大人感论,你說我怎么就攤上這事∥刹幔” “怎么了比肄?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵快耿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我芳绩,道長(zhǎng)掀亥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任妥色,我火速辦了婚禮搪花,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嘹害。我一直安慰自己撮竿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布笔呀。 她就那樣靜靜地躺著幢踏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪许师。 梳的紋絲不亂的頭發(fā)上房蝉,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音枯跑,去河邊找鬼惨驶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛敛助,可吹牛的內(nèi)容都是我干的粗卜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼纳击,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼续扔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起焕数,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤纱昧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后堡赔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體识脆,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年善已,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灼捂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡换团,死狀恐怖悉稠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情艘包,我是刑警寧澤的猛,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布耀盗,位于F島的核電站,受9級(jí)特大地震影響卦尊,放射性物質(zhì)發(fā)生泄漏叛拷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一猫牡、第九天 我趴在偏房一處隱蔽的房頂上張望胡诗。 院中可真熱鬧,春花似錦淌友、人聲如沸煌恢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瑰抵。三九已至,卻和暖如春器联,著一層夾襖步出監(jiān)牢的瞬間二汛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工拨拓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肴颊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓渣磷,卻偏偏與公主長(zhǎng)得像婿着,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子醋界,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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

  • 筆記來源于以下文章:http://liuwangshu.cn/application/gradle/5-plugi...
    Yolyn閱讀 938評(píng)論 0 1
  • 在 Android Studio 構(gòu)建的項(xiàng)目中竟宋,基于 Gradle 進(jìn)行項(xiàng)目的構(gòu)建,同時(shí)使用 Android DS...
    Ant_way閱讀 7,365評(píng)論 0 16
  • Gradle 是一款構(gòu)建系統(tǒng)工具形纺,它的 DSL 基于 Groovy 實(shí)現(xiàn)丘侠。Gradle 構(gòu)建的大部分功能都是通過插...
    任教主來也閱讀 3,058評(píng)論 3 6
  • 前言 從2013年Google推出Android Studio(后面以AS簡(jiǎn)稱)開始,到現(xiàn)在已經(jīng)歷經(jīng)3年逐样,版本也發(fā)...
    dfqin閱讀 1,844評(píng)論 1 3
  • 事件回顧: 4月12日,家住巴南區(qū)的張女士報(bào)警稱戏羽,七歲半的女兒在學(xué)校旁的超市內(nèi)順手牽羊拿走一瓶奶茶,被超市老板當(dāng)場(chǎng)...
    沐微眠閱讀 539評(píng)論 0 2