Android實(shí)現(xiàn)Gradle插件

上一篇Android使用FreeMarker制作代碼模板中寫(xiě)道缩滨,利用FreeMarker來(lái)實(shí)現(xiàn)代碼模板轉(zhuǎn)換為java文件天试,這一篇將要描述如果通過(guò)插件將我們的FreeMarker工具類(lèi)利用上趁啸。

1. 準(zhǔn)備工作

在上一篇中所使用的項(xiàng)目的基礎(chǔ)上進(jìn)行更改天通,來(lái)實(shí)現(xiàn)通過(guò)利用Gradle插件自動(dòng)生成java文件的功能娃肿。這里我使用的是Gradle-Plugins網(wǎng)站疾嗅,通過(guò)這個(gè)網(wǎng)站,我們可以發(fā)布我們的插件應(yīng)用谴蔑。

????1.1 首先豌骏,打開(kāi)Module下的build.gradle文件,輸入如下部分隐锭,創(chuàng)建groovy的語(yǔ)言環(huán)境:

apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
    compile gradleApi()
    compile localGroovy()
}

repositories {
    mavenCentral()
}

1.2 在mian文件夾下肯适,創(chuàng)建一個(gè)文件夾,命名為groovy成榜,創(chuàng)建完成后框舔,android studio會(huì)自動(dòng)識(shí)別。在groovy文件夾下創(chuàng)建我們的包名赎婚,這里我創(chuàng)建的包名與java文件夾下的包名一樣刘绣,但不影響,如下圖:
groovy和java的包

1.3 實(shí)現(xiàn)插件挣输。如下代碼PluginImpl所示纬凤,其主要部分是使用project.afterEvaluate將任務(wù)插入到所有任務(wù)中:

package com.hu.freemarkerlib

import com.hu.freemarkerlib.bean.PluginBean
import org.gradle.api.Plugin
import org.gradle.api.Project
import java.io.File
import com.hu.freemarkerlib.task.FreeMarkerTask

public class PluginImpl implements Plugin<Project> {
    void apply(Project project) {
        println "Hello gradle plugin"
        project.extensions.create('pluginImpl', PluginBean)

        project.task("showName") << {
            def pluginBean = project.extensions.pluginImpl
            println("--------------------------------------------------------------------------------------")
            println(pluginBean.outDirFile);
            println(pluginBean.packageName);
            println(pluginBean.clazzName);
            println(pluginBean.id);
            println(pluginBean.sex);
        }

        def freeMarkerTask = project.tasks.create("FreeMarkerTask", FreeMarkerTask)

        project.afterEvaluate {
            freeMarkerTask.execute()
        }
    }
}

然后在src/mian/resources/中創(chuàng)建文件夾META-INF/gradle-plugins/,在其下創(chuàng)建以.properties結(jié)尾的文件撩嚼,名稱(chēng)任意停士,在文件中放入你的插件實(shí)現(xiàn):

implementation-class=com.hu.freemarkerlib.PluginImpl

放入你的插件的路徑的意義在于告知插件的位置所在。

2. 實(shí)現(xiàn)代碼

FreeMarkerTask實(shí)現(xiàn):

package com.hu.freemarkerlib.task

import com.hu.freemarkerlib.Generator
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction

class FreeMarkerTask extends DefaultTask {
  FreeMarkerTask() {
    super()
  }

  @TaskAction
  def doAction() {
    def pluginBean = project.extensions.pluginImpl
    println("----------------------------------------***************************--------------------")
    println(pluginBean.toString())
    def daoGenerator = new Generator()
    daoGenerator.generate(pluginBean.outDirFile,pluginBean.packageName, pluginBean.clazzName,pluginBean.id,pluginBean.sex,pluginBean.name)
  }
}

其PluginBean的實(shí)現(xiàn)如下:

package com.hu.freemarkerlib.bean

class PluginBean {
    private Integer id = 23;
    private String name = 'Jeck';
    private String sex = 'man';
    private String clazzName = 'defaultClassName';
    private String packageName = 'defaultPackage';
    private String outDirFile = 'defaultDir';

    Integer getId() {
        return id
    }
    void setId(Integer id) {
        this.id = id
    }
    String getName() {
        return name
    }
    void setName(String name) {
        this.name = name
    }
    String getSex() {
        return sex
    }
    void setSex(String sex) {
        this.sex = sex
    }
    String getClazzName() {
        return clazzName
    }
    void setClazzName(String clazzName) {
        this.clazzName = clazzName
    }
    String getPackageName() {
        return packageName
    }
    void setPackageName(String packageName) {
        this.packageName = packageName
    }
    String getOutDirFile() {
        return outDirFile
    }
    void setOutDirFile(String outDirFile) {
        this.outDirFile = outDirFile
    }

    @Override
    public String toString() {
        return "PluginBean{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", clazzName='" + clazzName + '\'' +
                ", packageName='" + packageName + '\'' +
                ", outDirFile='" + outDirFile + '\'' +
                '}';
    }
}
  • 添加發(fā)布插件配置信息

Gradle-Plugins網(wǎng)站中可以了解到如何配置你的插件完丽,這里貼出主要部分:

// First, apply the publishing plugin
buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "com.gradle.publish:plugin-publish-plugin:0.9.10"
  }
}

apply plugin: "com.gradle.plugin-publish"

// Unless overridden in the pluginBundle config DSL, the project version will
// be used as your plugin version when publishing
version = "0.15"
group = "com.hu.freemarkerlib"

// The configuration example below shows the minimum required properties
// configured to publish your plugin to the plugin portal
pluginBundle {
    website = 'https://github.com/RaysHuch/'
    vcsUrl = 'https://github.com/RaysHuch/FreeMarkerDemo'
    description = 'Use FreeMarker for android and gradle'
    tags = ['freeMarkerPlugin']

    plugins {
        greetingsPlugin {
            id = 'com.hu.freemarkerlib'
            displayName = 'Gradle Greeting plugin'
        }
    }
}

在此同時(shí)恋技,需要在C:\Users${電腦用戶(hù)名}.gradle\gradle.properties中放入你的key和secret:

gradle.publish.key=************************************
gradle.publish.secret=*************************************

進(jìn)行了以上操作后,你就可以將你的插件發(fā)布的網(wǎng)站中了逻族,有時(shí)需要科學(xué)上網(wǎng)蜻底。

在你的項(xiàng)目中你會(huì)發(fā)現(xiàn)有如下變化:

新增的Task

首選需要點(diǎn)擊login的task,在Console中將會(huì)看到:

執(zhí)行"login"的Task

這里需要你點(diǎn)擊一下鏈接聘鳞,之后會(huì)出現(xiàn)成功的字樣(當(dāng)然是英文)薄辅。

到了最后一步,點(diǎn)擊你的publishPlugins的Task抠璃,將你的插件發(fā)布站楚,這樣你的插件就真真正正可以使用了!

3搏嗡、使用插件

插件的使用也是相當(dāng)簡(jiǎn)單窿春,按照如下配置,你的項(xiàng)目就可以起飛了:

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "gradle.plugin.com.hu.freemarkerlib:FreeMarkerLib:0.15"
  }
}

apply plugin: "com.hu.freemarkerlib"

4. 結(jié)語(yǔ)

由于是第一次使用插件,創(chuàng)建插件還是蠻簡(jiǎn)單的谁尸,但怎么執(zhí)行Task就成了老大難的問(wèn)題,一開(kāi)始認(rèn)為纽甘,直接在Plugin的apply方法中調(diào)用你的Java代碼就可以了良蛮,說(shuō)的沒(méi)錯(cuò),確實(shí)能夠順利執(zhí)行悍赢,讓我一度很興奮决瞳,終于插件能跑了。但是左权,當(dāng)我實(shí)現(xiàn)從build.gradle文件中讀取配置信息的時(shí)候就面臨了問(wèn)題皮胡,無(wú)論怎樣都不會(huì)讀取到所寫(xiě)的配置信息,各種搜索才知道赏迟,需要在project.afterEvaluate中執(zhí)行你的Task屡贺,build.gradle所配置的信息才會(huì)真正的加載運(yùn)行環(huán)境里。

傳送門(mén):

FreeMarkerDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锌杀,一起剝皮案震驚了整個(gè)濱河市甩栈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌糕再,老刑警劉巖量没,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異突想,居然都是意外死亡殴蹄,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)猾担,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)袭灯,“玉大人,你說(shuō)我怎么就攤上這事绑嘹〖寺” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵圾叼,是天一觀的道長(zhǎng)蛤克。 經(jīng)常有香客問(wèn)我,道長(zhǎng)夷蚊,這世上最難降的妖魔是什么构挤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮惕鼓,結(jié)果婚禮上筋现,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好矾飞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布一膨。 她就那樣靜靜地躺著,像睡著了一般洒沦。 火紅的嫁衣襯著肌膚如雪豹绪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,610評(píng)論 1 305
  • 那天申眼,我揣著相機(jī)與錄音瞒津,去河邊找鬼。 笑死括尸,一個(gè)胖子當(dāng)著我的面吹牛巷蚪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播濒翻,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼屁柏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了有送?” 一聲冷哼從身側(cè)響起前联,我...
    開(kāi)封第一講書(shū)人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎娶眷,沒(méi)想到半個(gè)月后似嗤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡届宠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年烁落,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豌注。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伤塌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出轧铁,到底是詐尸還是另有隱情每聪,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布齿风,位于F島的核電站药薯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏救斑。R本人自食惡果不足惜童本,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脸候。 院中可真熱鬧穷娱,春花似錦绑蔫、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至嫁盲,卻和暖如春篓叶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亡资。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留向叉,地道東北人锥腻。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像母谎,于是被迫代替她去往敵國(guó)和親瘦黑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

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