Gradle自定義插件

目錄

自定義腳本插件

自定義一個腳本插件比較簡單,直接在build.gradle中定義即可
首先需要在dependencies中加入依賴

dependencies {
    compile gradleApi()
    compile localGroovy()
}

然后創(chuàng)建Plugin

class ScriptPlugin implements Plugin<Project>{
    @Override
    void apply(Project project) {
        project.task("ScriptTask"){
            doLast {
                println("我是腳本插件")
            }
        }
    }
}
//應(yīng)用Plugin
apply plugin:ScriptPlugin

完整代碼如下

plugins {
    id 'groovy'
    id 'java'
}

group 'com.itfitness'
version '1.0'
archivesBaseName = 'test-plugin'
repositories {
    mavenCentral()
}

dependencies {
    compile gradleApi()
    compile localGroovy()
}

class ScriptPlugin implements Plugin<Project>{
    @Override
    void apply(Project project) {
        project.task("ScriptTask"){
            doLast {
                println("我是腳本插件")
            }
        }
    }
}
//應(yīng)用Plugin
apply plugin:ScriptPlugin

執(zhí)行ScriptTask結(jié)果如下


自定義buildSrc插件

這種方式需要在項目中新建一個module名字就叫buildSrc,創(chuàng)建后可能有如下報錯


這個時候需要找到項目的setting.build文件,將里面的include 'buildSrc'刪除


然后我們調(diào)整buildSrc目錄下的build.gradle文件如下所示

plugins {
    id 'groovy'
    id 'java'
}
dependencies {
    compile gradleApi()
    compile localGroovy()
}

然后我們在buildSrc下新建src/main/grovvy和src/main/resources目錄



然后我們在groovy目錄中創(chuàng)建自己的包目錄和Plugin文件



BuildSrcPlugin如下所示
package com.itfitness.plugin

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

class BuildSrcPlugin implements Plugin<Project>{
    @Override
    void apply(Project project) {
        project.task("BuildSrcTask"){
            doLast {
                println("我是buildSrc插件")
            }
        }
    }
}

然后我們可以在項目的build.gradle中引用

//應(yīng)用buildSrc插件
apply plugin: BuildSrcPlugin

執(zhí)行插件中定義的BuildSrcTask任務(wù)結(jié)果如下



此外還有可以通過配置Plugin的id來引用插件的方式,如下在resources文件夾下建立META-INF/gradle-plugins目錄并在里面新建<plugin的id>.properties文件(我這里的plugin的id設(shè)置為了com.itfitness.plugin):



然后在文件里配置好Plugin所在的類
implementation-class=com.itfitness.plugin.BuildSrcPlugin

這樣就可以通過id來引入Plugin了

plugins {
    id 'groovy'
    id 'java'
    ////應(yīng)用buildSrc插件(通過id)
    id 'com.itfitness.plugin'
}

這時我們同步下gradle可能會發(fā)現(xiàn)如下報錯



這個錯誤我也是查了好久才明白怎么回事,原因就是你新建META-INF/gradle-plugins文件夾的時候IDE把文件夾合并了



這個需要我們給他手動分開轧钓,分開后再同步就OK了,執(zhí)行結(jié)果與上面的一致

自定義獨立插件

獨立插件有個好處就是可以打包給別人使用锐膜,首先也是需要建立一個module毕箍,然后調(diào)整build.gradle文件


plugins {
    id 'groovy'
    id 'java'
    id 'maven'
}
repositories {
    mavenCentral()
}

dependencies {
    compile gradleApi()
    compile localGroovy()
}

group='com.itfitness.moduleplugin' //組名
version='1.0.0' //版本號
archivesBaseName='module-plugin' //工程名

//生成本地庫
uploadArchives{
    repositories {
        mavenDeployer{
            repository(url: uri('../ModulePlugin'))
        }
    }
}

接下來src中創(chuàng)建Plugin文件和配置文件與buildSrc的一樣,如下所示



ModulePlugin文件:

package com.itfitness.plugin

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

class ModulePlugin implements Plugin<Project>{
    @Override
    void apply(Project project) {
        project.task("ModuleTask"){
            doLast {
                println("我是獨立插件")
            }
        }
    }
}

com.itfitness.moduleplugin.properties文件:

implementation-class=com.itfitness.plugin.ModulePlugin

然后我們打開右側(cè)的gradle視圖找到uploadArchives任務(wù)雙擊執(zhí)行



或者直接在Module的build.gradle文件中執(zhí)行uploadArchives任務(wù)



執(zhí)行成功后道盏,當(dāng)前項目下就生成了ModulePlugin目錄而柑,里面就是生成的可以供別人使用的插件

使用方式如下,在項目的build.gradle文件中配置buildscript

buildscript {
    repositories {
        maven {
            url uri('./ModulePlugin')
        }
    }
    dependencies {
        //與插件module中的build.gradle配置的要一一對應(yīng)
        classpath 'com.itfitness.moduleplugin:module-plugin:1.0.0'
    }
}

然后在Module中引入插件(注意不能直接在項目的build.gradle中引入荷逞,會提示錯誤)媒咳,我這里在plugin的build.gradle文件中引入插件

plugins {
    id 'groovy'
    id 'java'
    id 'maven'
    //應(yīng)用獨立插件
    id 'com.itfitness.moduleplugin'
}

執(zhí)行插件中創(chuàng)建的ModuleTask結(jié)果如下


注意

\color{red}{一定要注意配置plugin的id時META-INF與gradle-plugins目錄合并的問題,否則會提示找不到plugin}

案例源碼

https://gitee.com/itfitness/gradle-plugin-demo

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末种远,一起剝皮案震驚了整個濱河市涩澡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坠敷,老刑警劉巖妙同,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異常拓,居然都是意外死亡渐溶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門弄抬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茎辐,“玉大人,你說我怎么就攤上這事⊥下剑” “怎么了弛槐?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長依啰。 經(jīng)常有香客問我乎串,道長,這世上最難降的妖魔是什么速警? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任叹誉,我火速辦了婚禮,結(jié)果婚禮上闷旧,老公的妹妹穿的比我還像新娘长豁。我一直安慰自己,他們只是感情好忙灼,可當(dāng)我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布匠襟。 她就那樣靜靜地躺著,像睡著了一般该园。 火紅的嫁衣襯著肌膚如雪酸舍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天里初,我揣著相機與錄音啃勉,去河邊找鬼。 笑死双妨,一個胖子當(dāng)著我的面吹牛璧亮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斥难,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼帘饶!你這毒婦竟也來了哑诊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤及刻,失蹤者是張志新(化名)和其女友劉穎镀裤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缴饭,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡暑劝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了颗搂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片担猛。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出傅联,到底是詐尸還是另有隱情先改,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布蒸走,位于F島的核電站仇奶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏比驻。R本人自食惡果不足惜该溯,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望别惦。 院中可真熱鬧狈茉,春花似錦、人聲如沸步咪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猾漫。三九已至点晴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悯周,已是汗流浹背粒督。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留禽翼,地道東北人屠橄。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像闰挡,于是被迫代替她去往敵國和親锐墙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,652評論 2 354

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