gradle 發(fā)布多 flavor maven aar 庫

問題背景

最近, 項目中一直維護(hù)的一個 maven aar 庫. 由于業(yè)務(wù)發(fā)展, 需要定義 2 個 flavor 并打包上傳2 個 flavor aar 包到 maven 庫. 實現(xiàn)過程中遇到了一些坑, 在此記錄下來.

如何發(fā)布兩個 flavor 的 aar 到 maven 倉庫?

首先介紹一下, 發(fā)布 maven 庫目前有 2 個可用的 gradle 插件:

  • maven plugin (早期的 maven 插件, 目前已經(jīng)不再維護(hù), 功能簡單, 問題比較多)
  • maven-publish plugin (gradle 目前推薦使用的, 功能更強大, 需要高版本 gradle 的支持)

最初是基于早期的 maven plugin gradle 腳本改寫的, 修改方法類似下面鏈接:

利用 gradle 多 aar 發(fā)布私有 maven

不知道上面博主是怎么實現(xiàn)的, 反正我按上面的實現(xiàn)遇到了一些坑:

問題一:

配置發(fā)布2個 flavor的庫, 生成的lib 中沒有包含 aar, 即使配置了 packaging = aar 也無效

需要手動通過 artifact 方法指定要打包集成的內(nèi)容, artifact 的參數(shù)可以是具體的文件名:

artifact ""$buildDir/outputs/aar/xxx.aar"

也可以指定一個 task, 比如這里我們指定打包 aar 的 task, 就可以實現(xiàn)將 aar 打包到 maven 庫中:

artifact tasks.findByName("bundleXXXReleaseAar")

"bundleXXXReleaseAar"中的 XXX 是其中一個 flavor 的名字(首字母要大寫), 如果你用的是 Gradle Plugin 3.3.x 之前的版本, task 名字請使用 bundleXXXRelease

問題二:

發(fā)布的多個 flavor 的每個 aar 中包含都是遍歷 variant 最后一個執(zhí)行 artifact 指定的aar 產(chǎn)物.

maven plugin 不支持分別給對應(yīng)的 flavor 單獨指定 artifact 的內(nèi)容. 當(dāng)遍歷 variant 配置 maven 時, 生效的只有最后一個 variant 指定的 artifact

解決方案

由于第二個問題無解, 于是開始嘗試?yán)?maven-publish 插件來實現(xiàn), 完美實現(xiàn)了多個 flavor 的 maven 發(fā)布, 自定義的 maven_push.gradle 如下:

apply plugin: 'maven-publish'
apply plugin: 'signing'

group = PROJ_GROUP
version = PROJ_VERSION

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

//發(fā)布前先執(zhí)行 clean, 避免發(fā)布的 aar 中使用了舊的緩存代碼
publish.dependsOn clean

//兼容老的 uploadArchives task 來執(zhí)行 aar 發(fā)布
uploadArchives.dependsOn publish

afterEvaluate {

    publishing {
        publications {
            //flavor1
            flavor1(MavenPublication) {
                artifactId = PROJ_ARTIFACTID_PREFIX + "flavor1"
                artifact tasks.findByName("bundleFlavor1ReleaseAar")

                pom {
                    name = PROJ_POM_NAME
                    packaging = POM_PACKAGING
                    description = PROJ_DESCRIPTION
                    url = PROJ_WEBSITEURL

                    scm {
                        url = PROJ_VCSURL
                        connection = DEVELOPER_EMAIL
                        developerConnection = DEVELOPER_EMAIL
                    }

                    licenses {
                        license {
                            name = PROJ_LICENCE_NAME
                            url = PROJ_LICENCE_URL
                            distribution = PROJ_LICENCE_DEST
                        }
                    }

                    developers {
                        developer {
                            id = DEVELOPER_ID
                            name = DEVELOPER_NAME
                        }
                    }
                }

            }

            //flavor2
            flavor2(MavenPublication) {
                artifactId = PROJ_ARTIFACTID_PREFIX + "flavor2"
                artifact tasks.findByName("bundleFlavor2ReleaseAar")

                pom {
                    name = PROJ_POM_NAME
                    packaging = POM_PACKAGING
                    description = PROJ_DESCRIPTION
                    url = PROJ_WEBSITEURL

                    scm {
                        url = PROJ_VCSURL
                        connection = DEVELOPER_EMAIL
                        developerConnection = DEVELOPER_EMAIL
                    }

                    licenses {
                        license {
                            name = PROJ_LICENCE_NAME
                            url = PROJ_LICENCE_URL
                            distribution = PROJ_LICENCE_DEST
                        }
                    }

                    developers {
                        developer {
                            id = DEVELOPER_ID
                            name = DEVELOPER_NAME
                        }
                    }
                }

            }

        }

        signing {
            sign publishing.publications.flavor1
            sign publishing.publications.flavor2
        }

        repositories {
            maven {
                credentials {
                    username NEXUS_USERNAME
                    password NEXUS_PASSWORD
                }
                url = version.endsWith('SNAPSHOT') ? SNAPSHOT_REPOSITORY_URL : RELEASE_REPOSITORY_URL
            }
        }

    }

}

def isReleaseBuild() {
    return PROJ_VERSION.contains("SNAPSHOT") == false
}

signing {
    required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
    sign configurations.archives
}

腳本中大寫的常量可以定義在 module 本地的 gradle.properties 配置文件中, 在 module 的 build.gradle 內(nèi)引用:

apply from: './maven_push.gradle'

這個 maven_push.gradle 可以作為發(fā)布多 flavor aar 包的通用模板.

需要注意的2點:

  • maven-publish 插件需要高版本的 gradle 插件的支持,我這里使用的 gradle plugin 版本為 3.4.1

  • maven-publish 插件上傳 maven 的命令是 publish, 而非 uploadArchives.

    為了兼容以前的習(xí)慣, 在 maven_push.gradle 腳本中加入task 依賴.

    uploadArchives.dependsOn publish
    

    另外, 為了從根本上解決upload 的代碼包含了之前生成的緩存代碼, 進(jìn)而將 publish task 依賴 clean task

    publish.dependsOn clean
    

    當(dāng)執(zhí)行uploadArchives時, 真正執(zhí)行的順序是:

    clean —> publish —> uploadArchives

參考鏈接

利用 gradle 多 aar 發(fā)布私有 maven

Artifacts and configurations

Maven Publish Plugin

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趣避,一起剝皮案震驚了整個濱河市斤儿,隨后出現(xiàn)的幾起案子舆瘪,更是在濱河造成了極大的恐慌算行,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炸站,死亡現(xiàn)場離奇詭異铜幽,居然都是意外死亡徽曲,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門除抛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叛买,“玉大人,你說我怎么就攤上這事惜互〔级铮” “怎么了琳拭?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長描验。 經(jīng)常有香客問我白嘁,道長,這世上最難降的妖魔是什么膘流? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任絮缅,我火速辦了婚禮,結(jié)果婚禮上呼股,老公的妹妹穿的比我還像新娘耕魄。我一直安慰自己,他們只是感情好彭谁,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布吸奴。 她就那樣靜靜地躺著,像睡著了一般缠局。 火紅的嫁衣襯著肌膚如雪则奥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天狭园,我揣著相機與錄音读处,去河邊找鬼。 笑死妙啃,一個胖子當(dāng)著我的面吹牛档泽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播揖赴,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼馆匿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了燥滑?” 一聲冷哼從身側(cè)響起渐北,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铭拧,沒想到半個月后赃蛛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡搀菩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年呕臂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肪跋。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡歧蒋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谜洽,我是刑警寧澤萝映,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站阐虚,受9級特大地震影響序臂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜实束,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一奥秆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧磕洪,春花似錦吭练、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谷异,卻和暖如春分尸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歹嘹。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工箩绍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尺上。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓材蛛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親怎抛。 傳聞我的和親對象是個殘疾皇子卑吭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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

  • Gradle 是一款構(gòu)建系統(tǒng)工具,它的 DSL 基于 Groovy 實現(xiàn)马绝。Gradle 構(gòu)建的大部分功能都是通過插...
    任教主來也閱讀 3,056評論 3 6
  • 在 Android Studio 構(gòu)建的項目中豆赏,基于 Gradle 進(jìn)行項目的構(gòu)建,同時使用 Android DS...
    Ant_way閱讀 7,356評論 0 16
  • 原文地址:https://docs.gradle.org/4.1/userguide/publishing_mav...
    SYfarming閱讀 3,182評論 4 3
  • 讀和訪屬于知識的輸入富稻,有輸入就得有輸出掷邦,輸出是檢驗輸入效果的唯一標(biāo)準(zhǔn)。有再多的學(xué)問憋在肚子里吐不出來椭赋,就狗屁不是抚岗。...
    想彈琴的砂子閱讀 203評論 0 0
  • 嘻嘻結(jié)束了一年級的生活,跨入二年級了哪怔,剛開學(xué)兩周我忙完各種事后宣蔚,終于靜下心來寫這篇一年級的感悟廷痘,回首這一年的生活,...
    櫻花83閱讀 7,527評論 0 3