本文首發於微信公衆號「劉望舒」html
關聯文章
Gradle核心思想(一)爲何如今要用Gradle?
Gradle核心思想(二)Gradle入門前奏
Gradle核心思想(三)Groovy快速入門指南
Gradle核心思想(四)看似無用,實則重要的Gradle Wrapper
Gradle核心思想(五)通俗易懂的Gradle插件講解前端
在本系列的前做中,咱們學習了爲何要用Gradle、Gradle的入門基礎和Groovy的基礎,這些文章爲Gradle的入門打下了基礎,這一篇咱們要來學習Gradle的插件。java
說到Gradle插件前,咱們先要了解下什麼是插件。在Android進階三部曲第二部《Android進階解密》一書中,我爲了講解插件化的原理,講解了什麼是插件,咱們先來看看下面這張圖。 android
能夠看到初始的機器人只有照相、地圖、瀏覽器、計算機等功能,這顯然是比較乏味的,咱們能夠給這個機器人安裝不少其餘的應用,使它提供更多的功能,以下圖所示咱們給這個機器人安裝了不少應用,這些應用不只覆蓋了人的衣食住行還提供了娛樂功能,咱們能夠玩遊戲、聽音樂和購物等等,機器人也獲得了極大的提高,可以購爲人類提供更多的服務。這些安裝的應用能夠理解爲插件,這個插件能夠自由的進行插拔,好比咱們須要玩遊戲時能夠安裝王者榮耀,若是很差玩就把它卸載掉。這麼說來其實Android、iOS、Mac等操做系統採用的都是這種思想,而Gradle也是如此。 Gradle自己和初始的機器人同樣,只是提供了基本的核心功能,其餘的特性好比編譯Java源碼的能力,編譯Android工程的能力等等就須要經過插件來實現了。本篇文章主要說的是Gradle插件,而不是Android Gradle插件。c++
要想應用插件,主要有兩個步驟,一是解析插件,二是把插件應用到項目中,應用插件經過 Project.apply() 方法來完成。 在Gradle中通常有兩種類型的插件,分別叫作腳本插件和對象插件。腳本插件是額外的構建腳本,它會進一步配置構建,能夠把它理解爲一個普通的build.gradle。對象插件又叫作二進制插件,是實現了Plugin接口的類,下面分別介紹如何使用它們。程序員
在上一篇文章Gradle核心思想(四)看似無用,實則重要的Gradle Wrapper的例子基礎上,定義一個other.gradle,例子的目錄結構是以下圖所示。 api
other.gradle瀏覽器
ext{
verson='1.0'
url='http://liuwangshu.cn'
}
複製代碼
這實際上不算是一個真正的腳本插件,就是一個簡單的腳本,主要是用於演示腳本插件是如何被應用的。咱們在build.gradle中來應用這個插件: build.gradle微信
apply from: 'other.gradle'
task test {
doLast {
println "版本爲:${verson},地址爲:${url}"
}
}
複製代碼
apply是Gradle project中提供的方法,用於配置項目中的插件。執行gradlew.bat test,會打印出想要的結果。app
咱們知道對象插件就是實現了org.gradle.api.plugins<Project>
接口的插件,對象插件能夠分爲內部插件和第三方插件。
若是咱們想要應用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'
複製代碼
第三方的對象插件一般是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相關的知識,脫離了本文的討論範圍,具體的請見後續的Gradle for Android系列。
Gradle的特性有四種狀態,分別是Internal、Incubating、Public、Deprecated,插件DSL屬於Incubating狀態(孵化狀態)。 這也致使插件DSL的特性在未來的Gradle版本中可能會發生變化,直到它再也不孵化爲止。 使用Java插件能夠這麼寫: build.gradle
plugins {
id 'java'
}
複製代碼
很簡潔,固然這是使用內部插件,若是外部插件被託管在https://plugins.gradle.org/,也能夠這樣寫: build.gradle
plugins {
id "com.jfrog.bintray" version "1.8.4"
}
複製代碼
不須要再配置buildscript了,直接配置plugins來使用插件。
對象插件是實現了org.gradle.api.plugins<Project>
接口的插件,這個接口中只定義個一個簡單的apply方法,想要自定義插件就須要去實現org.gradle.api.plugins<Project>
接口。 來實現一個簡單的自定義插件,爲了方便測試,再也不採用文本編輯,而是使用IntelliJ來編輯(AS也能夠),用IntelliJ來打開2.1小節的例子,改寫build.gradle文件: build.gradle
apply plugin:CustomPlugin
class CustomPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.task('CustomPluginTask') {
doLast {
println "自定義插件"
}
}
}
}
複製代碼
在build.gradle中自定義了一個插件CustomPlugin,在apply方法中建立一個名稱爲CustomPluginTask的任務。在IntelliJ的Terminal中輸入gradlew.bat CustomPluginTask來執行CustomPluginTask任務。
這個例子只能在本身項目中使用,並且比較簡單,更復雜的因爲篇幅緣由會在本系列的下一篇文章進行介紹。
Gradle插件能夠作什麼呢?主要有如下的幾點
使用Gradle插件主要有如下的好處:
本篇的文章篇幅不長,主要是沒有更多的介紹自定義對象插件,這個會在下一篇文章進行介紹。可能有的同窗發現了,本系列的Gradle的文章都儘可能不和Android和AS有所關聯,爲的是擺脫Android的束縛,Gradle自己就是一門技術,當咱們瞭解了Gradle的核心思想後,再去學習Android Gradle時會有豁然開朗的效果。
不只分享大前端、Java、Android、跨平臺等技術,還有大廠乾貨和程序員成長類文章。