Gradle之Gradle插件講解(五)

筆記來源于以下文章:
http://liuwangshu.cn/application/gradle/5-plugins.html

前面我們學習了為什么要用Gradle、Gradle的入門基礎和Groovy的基礎,這些文章為Gradle的入門打下了基礎,這一篇我們要來學習Gradle的插件。

1. Gradle插件概述

說到Gradle插件前,我們先要了解下什么是插件。我們先來看看下面這張圖。

image

可以看到初始的機器人只有照相、地圖、瀏覽器、計算機等功能,這顯然是比較乏味的,我們可以給這個機器人安裝很多其他的應用,使它提供更多的功能,如下圖所示
image

我們給這個機器人安裝了很多應用,這些應用不僅覆蓋了人的衣食住行還提供了娛樂功能,我們可以玩游戲、聽音樂和購物等等,機器人也得到了極大的提升,能夠購為人類提供更多的服務。這些安裝的應用可以理解為插件,這個插件可以自由的進行插拔,比如我們需要玩游戲時可以安裝王者榮耀,如果不好玩就把它卸載掉。這么說來其實Android、iOS、Mac等操作系統采用的都是這種思想,而Gradle也是如此。

Gradle本身和初始的機器人一樣,只是提供了基本的核心功能,其他的特性比如編譯Java源碼的能力,編譯Android工程的能力等等就需要通過插件來實現了。本篇文章主要說的是Gradle插件,而不是Android Gradle插件。

2. 應用Gradle插件

想要應用插件,主要有兩個步驟。一是解析插件,二是把插件應用到項目中,應用插件通過Project.apply()方法來完成。
在Gradle中一般有兩種類型的插件,分別叫做腳本插件和對象插件。腳本插件是額外的構建腳本,它會進一步配置構建,可以把它理解為一個普通的build.gradle。對象插件又叫做二進制插件,是實現了Plugin接口的類,下面分別介紹如何使用它們。

2.1 插件腳本

在上一篇Gradle Wrapper的例子基礎上,定義一個other.gradle,例子的目錄結構是如下圖所示:

ext{
    version='1.0'
    url="https://www.baidu.com"
}

這里先簡單講一下這個ext對象在這兒的作用,ext在這起到保存值得作用,在另一個gradle中apply后就可以直接引用這個ext存儲的值。

ext對象還可以進行gradle的復用,比方說another.gradle內容如下:


task hello{
    doLast{
        println 'hello from other script'
    }
}

def showMyName(){
    'i am a boy'
}

ext{
    showName = showMyName()
}

再apply別的gradle中就可以節省別的gradle的代碼,關于ext就暫時講這么多,繼續往下。

這個ext的屬性就類似于我們的錢包一樣,獨立屬于gradle與project對象。我們可以往這個ext對象里面放置屬性。

這里的這實際上不算是一個真正的腳本插件,就是一個簡單的腳本,主要是用于演示腳本插件是如何被應用的。我們在build.gradle中來應用這個插件:
build.gradle

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

apply是Gradle project中提供的方法,用于配置項目中的插件。執行gradlew.bat test,會打印出想要的結果。

PS D:\DevelopSoftWare_Location\Gradle\gradle_demo> gradle -q test
版本為:unspecified,地址為:https://www.baidu.com
PS D:\DevelopSoftWare_Location\Gradle\gradle_demo>
2.2 對象插件

我們知道對象插件就是實現了org.gradle.api.plugins<Project>接口的插件,對象插件可以分為內部插件和第三方插件。

2.2.1 內部插件

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

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

Gradle默認就導入了org.gradle.api.plugins包,因此我們也可以去掉包名:

apply plugin: JavaPlugin

實現了org.gradle.api.plugins接口的插件會有pulginid,使用pulginid是最簡潔、最常用的方式:

apply plugin:'java'

Gradle的發行包中有大量的插件,這些插件有很多類型,比如語言插件、集成插件、軟件開發插件等等,比方說我們想向項目中添加c++源代碼編譯功能,可以這么寫:

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

第三方的對象插件通常是jar文件,要想讓構建腳本知道第三方插件的存在,需要使用buildscrip來設置。

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中來定義插件所在的原始倉庫的插件和依賴,再通過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工程插件,這樣項目會編譯成為一個apk,這里涉及了Android相關的知識,脫離了本文的討論范圍,在這先簡單介紹一下

  • buildscript{}這個是基礎配置,所有的子模塊都會讀取到這個配置里面的內容,當構建開始的時候,就開始讀取這個buildscript{}里面的內容。
  • repositories{}這個模塊的內容告訴gradle去什么地址下載第三方的庫。
  • jcenter()代表 https://bintray.com/bintray/jcenter
  • mavenCentral() 代表使用maven的服務器 https://search.maven.org/
2.3 插件DSL

Gradle的特性有四種狀態,分別是Internal、Incubating、Public、Deprecated(棄用),插件DSL屬于Incubating狀態(孵化狀態)。
這也導致插件DSL的特性在將來的Gradle版本中可能會發生變化,直到它不再孵化為止。
使用Java插件可以這么寫:
build.gradle

plugin{
    
    id 'java'
}

很簡潔,當然這是使用內部插件,如果外部插件被托管在https://plugins.gradle.org/,也可以這樣寫:

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

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

2.4 自定義對象插件

對象插件是實現了org.gradle.api.plugins<Project>接口的插件,這個接口中只定義個一個簡單的apply方法,想要自定義插件就需要去實現org.gradle.api.plugins<Project>接口。
來實現一個簡單的自定義插件,為了方便測試,不再采用文本編輯,而是使用IntelliJ來編輯(AS也可以),我這里是用AS,改寫build.gradle文件:

// Apply the plugin
apply plugin: GreetingPlugin


class GreetingPlugin implements Plugin<Project> {
    void apply(Project project) {
        project.task('hello') {
            doLast {
                println 'Hello from the GreetingPlugin'
            }
        }
    }
}

在build.gradle中自定義了一個插件GreetingPlugin,在apply方法中創建一個名稱為hello的任務。在AS的Terminal中輸入gradlew.bat hello來執行hello任務。

D:\DevelopSoftWare_Location\Android_Studio\DemoWorkSpace\DefinedGradle>gradlew hello

> Task :app:hello 
Hello from the GreetingPlugin


BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

這個例子只能在自己項目中使用,而且比較簡單

3. 插件的作用和好處

Gradle插件可以做什么呢?主要有以下幾點:

  1. 為項目配置依賴。
  2. 為項目配置約定,比如約定源代碼的存放位置。
  3. 為項目添加任務,完成測試、編譯、打包等任務。
  4. 為項目中的核心對象和其他插件的對象添加拓展類型。

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

  1. 重用和減少維護在多個項目類似的邏輯的開銷。
  2. 更高程度的模塊化。
  3. 封裝必要的邏輯,并允許構建腳本盡可能是聲明性地。

最后

本篇的文章篇幅不長,主要是沒有更多的介紹自定義對象插件??赡苡械耐瑢W發現了,本系列的Gradle的文章都盡量不和Android和AS有所關聯,為的是擺脫Android的束縛,Gradle本身就是一門技術,當我們了解了Gradle的核心思想后,再去學習Android Gradle時會有豁然開朗的效果

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,486評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,462評論 2 378

推薦閱讀更多精彩內容

  • Gradle 是一款構建系統工具,它的 DSL 基于 Groovy 實現。Gradle 構建的大部分功能都是通過插...
    任教主來也閱讀 3,086評論 3 6
  • 參考資料:http://gold.xitu.io/post/580c85768ac247005b5472f9htt...
    zhaoyubetter閱讀 11,023評論 0 6
  • 在 Android Studio 構建的項目中,基于 Gradle 進行項目的構建,同時使用 Android DS...
    Ant_way閱讀 7,409評論 0 16
  • Android Studio作為Android應用開發的官方IDE,默認使用Gradle作為構建工具,所以對于An...
    feil0n9wan9閱讀 1,691評論 1 6
  • 站在高山上的人 有的像狐貍一樣狡猾 在世上到處麻痹人心 有的像豺狼一樣兇狠 在人間遍地啃食人血 趴在地面上的人 有...
    歐陽小川閱讀 1,162評論 103 92