直奔主題,在模塊化開發(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è)不同的模塊。
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文件夾
定義接口泻红,并實(shí)現(xiàn)接口服務(wù)
直接在mis文件夾下,創(chuàng)建對(duì)應(yīng)的包名霞掺、接口類和數(shù)據(jù)Model谊路。并在java文件夾下實(shí)現(xiàn)接口服務(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
惨恭。groupId
、artifactId
耙旦、version
對(duì)應(yīng)的是Maven的GAV脱羡。初次配置時(shí)不設(shè)置version
,發(fā)布至maven時(shí)設(shè)置version
。在
dependencies
中可聲明該mis編譯和運(yùn)行時(shí)需用到的第三方庫锉罐,僅支持compileOnly
和implementation
帆竹。
發(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ù)侨舆。
其中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è)置publication
的version
玷氏。通過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