本文首發(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)。