gradle插件基礎(chǔ)

gradle插件分為兩種筐带,一種是腳本插件廓八,一種是對象插件

腳本插件:腳本插件就是一個普通的xxx.gradle文件其馏,通過在xxx.gradle定義一系列task,在另一個gradle文件中通過
apply from:'xxx.gradle'引用即可使用xxx.gradle定義的task爆安。

主工程根目錄創(chuàng)建xxx.gradle文件(xxx代表任意)

xxx.gradle文件
task testPlugin{
    doLast{
        println("xxx.gradle doLast")
    }
}

module工程引用叛复,本次是app主工程的build.gradle引用:

apply from:"../xxx.gradle"

主要xxx.gradle與app工程同級因此需要../

引用完成后就可以輸入編譯命令:

gradle testPlugin

輸出:

> Task :app:testPlugin
xxx.gradle doLast

對象插件
對象插件是指實現(xiàn)了org.gradle.api.Plugin接口的類。類需要實現(xiàn)void apply(T target)方法扔仓,T為泛型代表插件
作用到的對象褐奥。通常為Project對象。

編寫對象插件有三種方式:

1.直接在gradle腳本文件中
2.在工程的buildSrc工程下面
3.獨立工程

相比而言翘簇,1和2兩種方式都是不對外暴露的撬码,只能在當(dāng)前工程或者module之間使用,如果要讓其他項目使用還是需要使用
第三種方式版保。
下面我們一一來實現(xiàn)一下:

在gradle腳本中實現(xiàn)

此方法最簡單呜笑,直接打開app.gradle寫入,下面代碼增加動態(tài)配置的代碼
1.實現(xiàn)Plugin接口找筝,重寫apply方法

插件拓展
class CustomExtension{
    def message = "extension message"
    def what = 0
}

class CustomPlugin implements Plugin<Project> {

    @Override
    void apply(Project target) {
        //插件擴展參數(shù)為名稱 類型 和參數(shù)(可無)
        def extension = target.extensions.create("cusExtension",CustomExtension)
        target.task("pluginTask"){
            doLast{
                println("task name is ${name}  message is ${extension.message}  what is ${extension.what}")
            }
        }
    }
}

配置擴展

cusExtension.message = "extension change   message"

通過DSL塊配置擴展

cusExtension{
    message = "extension DSL change   message"
    what = 2
}

2.依賴插件

apply plugin : CustomPlugin

執(zhí)行命令:

gradlew pluginTask

輸出結(jié)果:

> Task :pluginTask
task name is pluginTask  message is extension DSL change   message  what is 2
buildSrc目錄下

工程目錄下新建buildSrc moudle蹈垢,因為buildSrc不是一個Android moudle工程慷吊,因此需要我們做一些處理袖裕。

1.刪除工程目錄下main文件夾中的資源
2.在main文件夾下新建groovy文件夾(buildSrc/src/main/groovy)并創(chuàng)建包名文件夾,在包名文件夾下創(chuàng)建 CustomAlonePlugin.groovy文件(CustomAlonePlugin是文件名)溉瓶,我們的插件代碼在寫在其中急鳄。

注意:一定要寫.groovy后綴,不然工具識別不出

package com.myplugin

import org.gradle.api.Plugin
import org.gradle.api.Project

public class CustomAlonePlugin implements Plugin<Project> {

    @Override
    void apply(Project target) {
        //插件擴展參數(shù)為名稱 類型 和參數(shù)(可無)
        def extension = target.extensions.create("cusExtension",CustomExtension)
        target.task("pluginTask"){
            doLast{
                println("task name is ${name}  message is ${extension.message}  what is ${extension.what}")
            }
        }
    }
}

class CustomExtension{
    def message = "extension message"
    def what = 0
}

其中CustomExtension是配置項堰酿,供依賴項動態(tài)配置修改疾宏,配置方法和上面配置一樣

3.main文件夾下面創(chuàng)建resources文件夾,在此文件夾下創(chuàng)建META-INF/gradle-plugins文件夾路徑触创,在此文件夾中創(chuàng)建myCustomPlugin.properties文件(buildSrc/src/main/resources/META-INF/gradle-plugins/myCustomPlugin.properties)坎藐。

注意myCustomPlugin就是插件的id(可修改),供其他module依賴。

4.myCustomPlugin.properties文件夾下配置代碼:
implementation-class = com.myplugin.CustomAlonePlugin//對應(yīng)插件的類
5.build.gradle下添加依賴
apply plugin: 'groovy'
dependencies {
    implementation gradleApi()
    implementation localGroovy()
}
6.依賴插件

寫完上面的代碼后岩馍,module就可以依賴了

apply plugin : 'myCustomPlugin'
//配置擴展
cusExtension.message = "extension change   message"

//通過DSL塊配置擴展
cusExtension{
    message = "extension DSL change   message"
    what = 2
}

執(zhí)行:

gradlew pluginTask

結(jié)果:

> Task :pluginTask
task name is pluginTask  message is extension DSL change   message  what is 2
獨立工程

buildSrc中創(chuàng)建插件只能在單一工程下多模塊復(fù)用碉咆,要想在多個項目中復(fù)用就需要使用獨立工程編寫插件
,然后將插件上傳到maven倉庫中蛀恩,最后在需要以來的項目中顯式的添加對插件的依賴疫铜。

為了節(jié)省時間我們直接在本工程中創(chuàng)建一個standalone插件模塊,但是我們要注意的是這是一個完全獨立模塊双谆。
可以看到獨立工程的模塊和buildSrc模塊結(jié)構(gòu)是一樣的壳咕。區(qū)別在于buildSrc代碼在構(gòu)建是自動會被編譯并被引用。
而獨立模塊的則需要編譯之后上傳到maven倉庫中顽馋,然后在需要引用的項目中顯式的引用谓厘。

插件代碼和之前一樣只是改了名稱

package com.myplugin

import org.gradle.api.Plugin
import org.gradle.api.Project

public class StandAlonePlugin implements Plugin<Project> {

    @Override
    void apply(Project target) {
        //插件擴展參數(shù)為名稱 類型 和參數(shù)(可無)
        def extension = target.extensions.create("cusExtension",StandExtension)
        target.task("pluginTask"){
            doLast{
                println("task name is ${name}  message is ${extension.message}  what is ${extension.what}")
            }
        }
    }
}


class StandExtension{
    def message = "extension message"
    def what = 0
}

build.gradle則有的不同,因為需要發(fā)布到maven寸谜,所以增加了發(fā)布的代碼:
引用依賴apply plugin: 'maven'庞呕,通過maven插件快速的配置group version和uploadArchives相關(guān)屬性。
為了方便本次上傳到主工程repo文件夾下面

apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
    implementation gradleApi()
    implementation localGroovy()
}
group 'com.myplugin.plugin'
version '1.0.0'
uploadArchives{
    repositories {
        mavenDeployer {
            repository(url:uri('../repo'))
        }
    }
}

然后執(zhí)行命令gradlew uploadArchives或者在AS右側(cè)邊欄對應(yīng)工程的tasks中找到uploadArchives程帕,
點擊執(zhí)行住练。執(zhí)行完畢后就可以在主工程找到repo目錄。里面存放的是生成好的jar包與一些文件愁拭。maven-metadata.xml存放的是配置信息

<metadata>
  <groupId>com.myplugin.plugin</groupId>
  <artifactId>standalone</artifactId>
  <versioning>
    <release>1.0.0</release>
    <versions>
      <version>1.0.0</version>
    </versions>
    <lastUpdated>20191225120458</lastUpdated>
  </versioning>
</metadata>

然后我們就可以在主工程build.gradle依賴插件讲逛。依賴規(guī)則

classpath 'groupId:artifactId:version'

同時在repositories中添加依賴路徑

maven {
 url uri('repo')
}
buildscript下配置代碼如下:
buildscript {
    repositories {
        //maven倉庫路徑
        maven {
            url uri('repo')
        }
        google()
        jcenter()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.1'
        //依賴
        classpath 'com.myplugin.plugin:standalone:1.0.0'

    }
}

依賴完成后我們可以在對應(yīng)的子工程的build.gradle中進行依賴插件

apply plugin :'standAlonePlugin'
cusExtension.message = "extension change    message"

//通過DSL塊配置擴展
cusExtension{
    message = "extension DSL change   message"
    what = 2
}

執(zhí)行命令:

gradlew pluginTask

輸出日志:

StandAlonePlugin task name is pluginTask  message is extension DSL change   message  what is 2

說明引用成功。

總結(jié):

1.插件分為腳本插件和對象插件
2.腳本插件直接在.gradle文件中編寫岭埠,通過apply from '文件名.gradle'引用
3.對象插件需要繼承Plugin類盏混,實現(xiàn)apply方法∠郏可以在當(dāng)前build.gradle中編寫也可以在buildSrc模塊中
編寫還可以在獨立工程中編寫许赃。當(dāng)前模塊下編寫的可以通過apply plugin :'ClassName'依賴。buildSrc和獨立模塊通過pluginId依賴apply plugin:'pluginId'

本文寫的插件只是一些簡單的插件馆类,目的是簡單了解一下gradle的流程混聊。
本文參考:玉剛說文章
官方自定義插件文章

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市乾巧,隨后出現(xiàn)的幾起案子句喜,更是在濱河造成了極大的恐慌,老刑警劉巖沟于,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咳胃,死亡現(xiàn)場離奇詭異,居然都是意外死亡旷太,警方通過查閱死者的電腦和手機展懈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人存崖,你說我怎么就攤上這事榄攀。” “怎么了金句?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵檩赢,是天一觀的道長。 經(jīng)常有香客問我违寞,道長贞瞒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任趁曼,我火速辦了婚禮军浆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挡闰。我一直安慰自己乒融,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布摄悯。 她就那樣靜靜地躺著赞季,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奢驯。 梳的紋絲不亂的頭發(fā)上申钩,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音瘪阁,去河邊找鬼撒遣。 笑死,一個胖子當(dāng)著我的面吹牛管跺,可吹牛的內(nèi)容都是我干的义黎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼豁跑,長吁一口氣:“原來是場噩夢啊……” “哼廉涕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贩绕,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤火的,失蹤者是張志新(化名)和其女友劉穎壶愤,沒想到半個月后淑倾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡征椒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年娇哆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡碍讨,死狀恐怖治力,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情勃黍,我是刑警寧澤宵统,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站覆获,受9級特大地震影響马澈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弄息,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一痊班、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摹量,春花似錦涤伐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至睦尽,卻和暖如春豆村,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背骂删。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工掌动, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宁玫。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓粗恢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親欧瘪。 傳聞我的和親對象是個殘疾皇子眷射,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

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

  • 背景 做為一個Android的開發(fā)者,我相信現(xiàn)在幾乎所有的Android開發(fā)都是利用Android Studio作...
    Only凹凸曼閱讀 4,034評論 1 10
  • Gradle 定義 Gradle是一個基于Apache Ant和Apache Maven概念的項目自動化建構(gòu)工具佛掖。...
    Code獵人閱讀 5,215評論 0 14
  • Gradle插件讓我們把可以復(fù)用的構(gòu)建邏輯打包起來妖碉,這樣就可以用到其他項目當(dāng)中。我們可以在Gradle中引用自己的...
    HoooChan閱讀 1,901評論 1 2
  • 五一假期芥被,心血來潮要做涼皮欧宜,和好面醒發(fā)后,就到了洗面環(huán)節(jié)拴魄,壯壯自告奮勇要來做冗茸,還像模像樣的系上了圍裙席镀,告訴他方法后...
    棲居在神恩典的臂彎閱讀 227評論 0 0
  • 今天學(xué)習(xí)的怎么和顧客聊天,鑫鑫店長給大家整理了一個很清晰的思路夏漱。感覺都是自己想多了豪诲,但是不想那么多怎么和顧客聊,是...
    加加_go閱讀 89評論 0 0