借助Gradle Plugin解決模塊化開發(fā)中模塊如何對(duì)外暴露接口

直奔主題,在模塊化開發(fā)中,模塊間的數(shù)據(jù)交流大多數(shù)同學(xué)會(huì)采用以接口作為通信協(xié)議的方式骑素。需要面對(duì)的問題有以下幾點(diǎn):

  • 接口由誰來維護(hù)?
    這個(gè)問題簡(jiǎn)單刚夺,由提供服務(wù)的模塊來維護(hù)献丑。

  • 接口怎么暴露末捣?
    打成jar包,發(fā)布到maven创橄。

  • 接口在哪里維護(hù)箩做?
    現(xiàn)在可以參考的方案有三種:一. 所有相關(guān)模塊的接口統(tǒng)一在一個(gè)模塊中維護(hù);二. 各個(gè)模塊的接口分別在自建一個(gè)新的模塊中維護(hù)妥畏,通過命名規(guī)則一一對(duì)應(yīng)邦邦;三. 像微信的.api方案,使用特殊的規(guī)則混雜在各自的模塊中醉蚁。

如果接著第一個(gè)問題燃辖,方案一好像就有點(diǎn)難確定接口對(duì)應(yīng)的來源模塊。方案二會(huì)出現(xiàn)接口模塊成倍增加网棍,極易出現(xiàn)一個(gè)模塊只含一個(gè)接口類的現(xiàn)象黔龟。方案三需要自定義相關(guān)插件,在創(chuàng)建接口時(shí)會(huì)有點(diǎn)不便滥玷,不夠靈活氏身。


MIS登場(chǎng)!;蟪搿蛋欣!接下來先介紹mis的簡(jiǎn)單使用以及背后的原理。

MIS

模塊接口服務(wù)(Module Interface Service)

MIS是從微信的.api方案演變而來桨菜,主要解決的問題是如何在一個(gè)模塊內(nèi)維護(hù)其對(duì)外暴露的接口(包括打包發(fā)布)豁状,而不是把接口和接口實(shí)現(xiàn)分離到兩個(gè)不同的模塊。

mis工程結(jié)構(gòu)

Usage

引用 mis 插件

在根項(xiàng)目的build.gradle中添加mis插件的classpath

buildscript {
    dependencies {
        ...
        classpath 'com.eastwood.tools.plugins:mis:1.3.5'
    }
}

在模塊的build.gradle中添加mis插件

...
apply plugin: 'mis'

創(chuàng)建 mis 目錄

Gradle Sync后倒得,在java同級(jí)目錄創(chuàng)建mis文件夾

mis目錄

定義接口泻红,并實(shí)現(xiàn)接口服務(wù)

直接在mis文件夾下,創(chuàng)建對(duì)應(yīng)的包名霞掺、接口類和數(shù)據(jù)Model谊路。并在java文件夾下實(shí)現(xiàn)接口服務(wù)。

mis接口服務(wù)

配置mis相對(duì)應(yīng)的publication

mis {
    publications {
        main {
            groupId 'com.eastwood.demo'
            artifactId 'library-sdk'
            // version '1.0.0-SNAPSHOT'

            dependencies {
                compileOnly 'com.google.code.gson:gson:2.8.1'
            }
        }
    }
    ...
}
  • main指的是src/main/java中的main菩彬,除了main之外缠劝,其值還可以為 build types和product flavors對(duì)應(yīng)的值,即對(duì)應(yīng)目錄下的mis骗灶。比如與src/debug/java對(duì)應(yīng)的src/debug/mis惨恭。

  • groupIdartifactId耙旦、version對(duì)應(yīng)的是Maven的GAV脱羡。初次配置時(shí)不設(shè)置version,發(fā)布至maven時(shí)設(shè)置version

  • dependencies中可聲明該mis編譯和運(yùn)行時(shí)需用到的第三方庫锉罐,僅支持compileOnlyimplementation帆竹。

發(fā)布至Maven

mis {
    publications {
        main {
            groupId 'com.eastwood.demo'
            artifactId 'library-sdk'
            version '1.0.0-SNAPSHOT'
            ...
        }
    }

    repositories {
        maven {
            url "http://***"
            credentials {
                username '***'
                password '***'
            }
        }
    }
    ...
}
  • 發(fā)布時(shí)需設(shè)置version

  • 發(fā)布時(shí)內(nèi)部用到的插件是maven-publish脓规,其中repositories相關(guān)設(shè)置請(qǐng)查閱# Maven Publish Plugin

Gradle Sync后栽连,打開Gradle Tasks View,選擇publishMis[...]PublicationToMavenRepository執(zhí)行發(fā)布任務(wù)侨舆。

上傳Task

其中publishMis[...]PublicationToMavenLocal 是發(fā)布至本地maven秒紧。如果使用本地maven,請(qǐng)將mavenLocal()添加至根項(xiàng)目的build.gradle中态罪,比如:

allprojects {
    repositories {
        google()
        jcenter()
        mavenLocal()
    }
}

Q&A

1.mis目錄下的類會(huì)參與編譯嗎噩茄?

不會(huì)。雖然mis目錄下的類能被java目錄下的類直接引用复颈,但不會(huì)參與編譯绩聘,真正參與編譯的是該mis目錄生成的jar包,其位于當(dāng)前工程.gradle/mis下耗啦。在當(dāng)前工程Sync&Build的時(shí)候凿菩,mis插件會(huì)對(duì)這些配置了publication的mis目錄進(jìn)行編譯打包生成jar包,并且依賴該jar包帜讲。

mis目錄下的類之所以能被java目錄下的類直接引用衅谷,是因?yàn)?code>mis目錄被設(shè)置為sourceSets aidl的src目錄,而Android Studio對(duì)sourceSets aidl的src目錄有特別支持似将。

2.沒有Maven私服获黔,所有模塊都在一個(gè)工程下,其他模塊怎么引用接口在验?

不設(shè)置publicationversion玷氏。通過misPublication聲明依賴,比如:

dependencies {
    ...
    implementation misPublication('com.eastwood.demo:library-sdk')
}

misPublication運(yùn)行機(jī)理是會(huì)自動(dòng)在當(dāng)前工程.gradle/mis下查找是否有對(duì)應(yīng)的mis提供的jar包腋舌。如果有盏触,就使用對(duì)應(yīng)的mis提供的jar包;如果沒有且指定了version块饺,就使用maven上的jar包赞辩。

3.將接口發(fā)布到maven后,其他模塊通過misPublication聲明依賴授艰,那jar包用的是.gradle/mis下的還是maven上的辨嗽?

接口被發(fā)布到maven后,其.gradle/mis下的jar包會(huì)被刪除淮腾,接口所在的模塊根據(jù)publication中設(shè)置的GAV使用maven上的jar包召庞。如果其他模塊通過misPublication聲明對(duì)其依賴岛心,比如:

dependencies {
    ...
    implementation misPublication('com.eastwood.demo:library-sdk')
    // 或 implementation misPublication('com.eastwood.demo:library-sdk:1.0.0-SNAPSHOT')
}

不管misPublication中是否設(shè)置了的version来破,都會(huì)使用maven上的jar包篮灼,其版本同接口所在的模塊publication中的GAV。

當(dāng)mis目錄下類發(fā)生實(shí)質(zhì)性的修改后(生成不同的jar包)徘禁,在當(dāng)前工程Sync&Build的時(shí)诅诱,會(huì)在.gradle/mis下的重新生成jar包,接口所在的模塊不管publication中是否設(shè)置version送朱,都使用.gradle/mis下的jar包娘荡。如果其他模塊通過misPublication聲明對(duì)其依賴,不管misPublication中是否設(shè)置的version驶沼,都會(huì)使用.gradle/mis下的jar包炮沐。

4.為什么在Gradle Tasks View中找不到publishing相關(guān)發(fā)布Task?

初次發(fā)布時(shí)回怜,請(qǐng)檢查對(duì)應(yīng)的publication是否已經(jīng)設(shè)置的version大年,以及是否添加相關(guān)repositories


最后

MIS已經(jīng)上傳至Github玉雾,歡迎star交流翔试。QQ 1056453754
https://github.com/EastWoodYang/Mis

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市复旬,隨后出現(xiàn)的幾起案子垦缅,更是在濱河造成了極大的恐慌,老刑警劉巖驹碍,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壁涎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡志秃,警方通過查閱死者的電腦和手機(jī)怔球,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洽损,“玉大人庞溜,你說我怎么就攤上這事”ǎ” “怎么了流码?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)延刘。 經(jīng)常有香客問我漫试,道長(zhǎng),這世上最難降的妖魔是什么碘赖? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任驾荣,我火速辦了婚禮外构,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘播掷。我一直安慰自己审编,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布歧匈。 她就那樣靜靜地躺著垒酬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪件炉。 梳的紋絲不亂的頭發(fā)上勘究,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音斟冕,去河邊找鬼口糕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛磕蛇,可吹牛的內(nèi)容都是我干的景描。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼孤里,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼伏伯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捌袜,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤说搅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后虏等,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弄唧,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年霍衫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了候引。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡敦跌,死狀恐怖澄干,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柠傍,我是刑警寧澤麸俘,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站惧笛,受9級(jí)特大地震影響从媚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜患整,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一拜效、第九天 我趴在偏房一處隱蔽的房頂上張望喷众。 院中可真熱鬧,春花似錦紧憾、人聲如沸到千。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽父阻。三九已至,卻和暖如春望抽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背履婉。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工煤篙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人毁腿。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓辑奈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親已烤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸠窗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344