發(fā)布Android library到maven倉(cāng)庫(kù)

最近完成的一個(gè)小的任務(wù)是將Andorid的SDK發(fā)布到公司的maven倉(cāng)庫(kù),供內(nèi)部開(kāi)發(fā)人員使用,這里記錄一下完成這一小的任務(wù)學(xué)習(xí)的知識(shí)以及踩的坑。

使用gradle發(fā)布Android library到maven倉(cāng)庫(kù)主要有兩種方式,一種是使用uploadArchives约啊,另一種是使用publish。下面分別對(duì)這兩種方式進(jìn)行介紹佣赖。

1.uploadArchives

uploadArchives是一種比較老的發(fā)布library到maven倉(cāng)庫(kù)的方式恰矩,我們?cè)谛枰虬l(fā)布的Module里的build.gradle模塊里增加如下代碼:

uploadArchives.png

關(guān)于groupIdartifactId憎蛤、version外傅,下圖進(jìn)行了詳細(xì)示例:
2.png

repository:即要把準(zhǔn)備發(fā)布的sdk發(fā)布到哪里,如果是發(fā)布到本地俩檬,那么就這里就填上本地的地址萎胰,如果是發(fā)布到maven倉(cāng)庫(kù),那么就填maven倉(cāng)庫(kù)的地址棚辽。這里的示例是發(fā)布到本地技竟,填寫(xiě)了本地的地址。

需要注意的是屈藐,repository中填寫(xiě)的路徑榔组,如果是本地路徑熙尉,那么要在路徑前面加上file://localhost的前綴,否則會(huì)發(fā)布不成功搓扯。

然后在項(xiàng)目根目錄的命令行下執(zhí)行命令:
./gradlew uploadArchives
我們就可以在repository所填寫(xiě)的地址下查看生成的SDK检痰。

SDK文件.png

上圖是生成的SDK文件的文件目錄,我們可以看到锨推,這里主要生成了兩個(gè)文件铅歼,一個(gè)是aar文件,另一個(gè)是pom文件爱态,其他文件均是這兩個(gè)文件的加密文件谭贪。aar文件我們都知道,那么pom文件到底是什么呢锦担?我們不妨打開(kāi)pom文件查看一下具體的內(nèi)容:
3.png

pom文件的內(nèi)容很清晰了,這里記錄了SDK的groupId,artifactId,version慨削,不光如此洞渔,這里還記錄了一個(gè)非常重要的內(nèi)容,即SDK的依賴缚态,dependencies節(jié)點(diǎn)下記錄的就是SDK的依賴磁椒,每一個(gè)dependency節(jié)點(diǎn)記錄一個(gè)依賴。dependencies依賴項(xiàng)是自動(dòng)生成的玫芦,記錄了SDK的依賴浆熔,當(dāng)該SDK被引用的時(shí)候,這些依賴會(huì)被傳遞

uploadArchives方式和publish方式的一個(gè)很大的區(qū)別就是uploadArchives會(huì)自動(dòng)生成pom文件里的dependencies節(jié)點(diǎn)桥帆,使得SDK的依賴被成功傳遞医增,而publish方式則需要自己手動(dòng)添加到pom文件。

使用已發(fā)布的SDK

使用已發(fā)布的SDK很簡(jiǎn)單老虫,我們只需要進(jìn)行比普通的引用多一步叶骨,即添加maven倉(cāng)庫(kù)的路徑,我們?cè)诠こ痰?code>build.gradle的allprojects下添加maven倉(cāng)庫(kù)的路徑:

maven {url '/Users/abc/.m2/repository/'}

然后在Modulebuild.gradle文件里正常引用:

implementation 'com.huya.hybrid:lizard:5.0.0-SNAPSHOT'

2.publish

使用publish方式發(fā)布library需要使用maven-publish插件祈匙。步驟如下:
首先在要發(fā)布的Module下的build.gradle文件同目錄下新建文件publish.gradle忽刽,在該文件中新建一個(gè)publish任務(wù):

apply plugin: 'maven-publish'

def getReleaseRepositoryUrl() {
    return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL
            : "https://oss.sonatype.org/content/repositories/releases/"
}

def getSnapshotRepositoryUrl() {
    return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL
            : "https://oss.sonatype.org/content/repositories/snapshots/"
}

def getRepositoryUsername() {
    return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : "admin"
}

def getRepositoryPassword() {
    return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : "admin123"
}

task sourcesJar(type: Jar) {
    classifier = 'sources'
    from android.sourceSets.main.java.srcDirs
}

publishing {
    publications {
        PublishAndroidAssetLibrary(MavenPublication) {
            groupId 'com.huya.hybrid'
            artifactId 'oak-webview-sdk'
            version version
            afterEvaluate {
                artifact bundleReleaseAar
            }
            artifact sourcesJar

            pom.withXml {
                //在pom.xml添加依賴關(guān)系
                def dependenciesNode = asNode().appendNode('dependencies')
                //拿到所有編譯時(shí)的依賴
                def dependenciesList = []
                dependenciesList.addAll(configurations.implementation.allDependencies)
                dependenciesList.addAll(configurations.api.allDependencies)
                dependenciesList.each {
                    if (null != it.group) {
                        def dependencyNode = dependenciesNode.appendNode('dependency')
                        dependencyNode.appendNode('groupId', it.group)
                        dependencyNode.appendNode('artifactId', it.name)
                        dependencyNode.appendNode('version', it.version)
                        dependencyNode.appendNode('scope', 'compile')
                    }
                }
                
        }
    }
}


def getRepositoryUrl() {
    if (version != null && version.toLowerCase().endsWith("snapshot")) {
        return getSnapshotRepositoryUrl()
    } else {
        return getReleaseRepositoryUrl()
    }
}

boolean isJenkinsBuild = 0 != (System.getenv("BUILD_NUMBER") as Integer ?: 0)
String localMavenRepoPath = hasProperty("LOCAL_REPO") ? getProperty("LOCAL_REPO") : "${rootDir}/outputs/android/maven"

println("isJenkinsBuild=$isJenkinsBuild,repo=$localMavenRepoPath")


publishing {
    repositories {
        if (isJenkinsBuild) {
            //這個(gè)是發(fā)布到線上倉(cāng)庫(kù)的功能支持
            maven {
                url getRepositoryUrl()
                credentials {
                    username = getRepositoryUsername()
                    password = getRepositoryPassword()
                }
            }
        } else {
            //這個(gè)是發(fā)布到本地目錄功能支持
            maven {
                url localMavenRepoPath
            }
        }
    }
}

首先看到publish任務(wù)的repository模塊,該模塊確定了SDK發(fā)布的地址夺欲。

4.png

然后看到publish的publications模塊跪帝,該模塊確定了SDK的groupId,artifactId,version等基本信息,還有一個(gè)非常重要的功能就是修改生成的pom文件些阅∩〗#可以使用pom.withXml進(jìn)行修改
5.png

這里我們可以看到,首先為pom文件增加了dependencies節(jié)點(diǎn)扑眉,然后是通過(guò)configurations.api.allDependenciesconfigurations.implementation.allDependencies獲取api引用和implementation引用纸泄,然后為每一個(gè)這種引用增加一個(gè)depemdency節(jié)點(diǎn)赖钞,在節(jié)點(diǎn)中設(shè)置groupIdartifactId聘裁,version,scope等屬性雪营,前幾個(gè)比較簡(jiǎn)單,后面這個(gè)scope衡便,它有6種選擇献起,具體可以看這里,使用compile即意味著镣陕,一旦引用了這個(gè)SDK谴餐,則pom文件中dependency內(nèi)scopecompile的依賴包都會(huì)被下載下來(lái)。所以對(duì)于SDK中想要傳遞的引用呆抑,scope需要使用complie岂嗓,如不需要傳遞的引用,則可以使用provided鹊碍。

然后在gradle.properties里面可以設(shè)置version:

version=1.0.0-SNAPSHOT

Modulebuild.gradle中引用publish.gradle:

apply from: "publish.gradle"

最后再根目錄下命令行執(zhí)行:

./gradlew publish

最后生成的文件目錄如下:

6.png

pom文件:
7.png

當(dāng)該SDK被引用時(shí)厌殉,pom文件中dependecy節(jié)點(diǎn)的scopecompile的依賴都會(huì)被下載下來(lái)。

最后是使用侈咕,首先是跟uploadArchives一樣添加maven倉(cāng)庫(kù)地址公罕,這個(gè)不再介紹。然后是在Modulebuild.gradle下添加引用:

implementation ('com.huya.hybrid:lizard:6.0.0-SNAPSHOT'){transitive = true}

最后多的這個(gè){transitive = true}用來(lái)顯式指出是否傳遞本身的依賴給宿主程序耀销。

參考

Maven publish plugin
https://developer.android.com/studio/build/dependencies
https://www.baeldung.com/maven-dependency-scopes

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末楼眷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子熊尉,更是在濱河造成了極大的恐慌罐柳,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帽揪,死亡現(xiàn)場(chǎng)離奇詭異硝清,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)转晰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門芦拿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人查邢,你說(shuō)我怎么就攤上這事蔗崎。” “怎么了扰藕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵缓苛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)未桥,這世上最難降的妖魔是什么笔刹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮冬耿,結(jié)果婚禮上舌菜,老公的妹妹穿的比我還像新娘。我一直安慰自己亦镶,他們只是感情好日月,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著缤骨,像睡著了一般爱咬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绊起,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天精拟,我揣著相機(jī)與錄音,去河邊找鬼勒庄。 笑死串前,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的实蔽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼谨读,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼局装!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起劳殖,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤铐尚,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后哆姻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體宣增,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年矛缨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爹脾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡箕昭,死狀恐怖灵妨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情落竹,我是刑警寧澤泌霍,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站述召,受9級(jí)特大地震影響朱转,放射性物質(zhì)發(fā)生泄漏蟹地。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一藤为、第九天 我趴在偏房一處隱蔽的房頂上張望怪与。 院中可真熱鬧,春花似錦凉蜂、人聲如沸琼梆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)茎杂。三九已至,卻和暖如春纫雁,著一層夾襖步出監(jiān)牢的瞬間煌往,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工轧邪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刽脖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓忌愚,卻偏偏與公主長(zhǎng)得像曲管,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子硕糊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345