一文詳解 jitpack 多渠道maven庫釋出

2023-02-22 06:01:30

先說一下,為什麼會有這篇文章?
最初接觸 JitPack 時,發現網路上大量涉及JitPack的教學不可用。通過兩天的研究才搞明白:
1.不同的gradle版本,gradle api使用方式 與 JitPack設定方式均有所差異:使用JitPack釋出Maven依賴庫,其設定指令碼與開發者使用的 gradle 版本是強相關的,因此不同的gradle版本,其API使用方式與 JitPack設定需做對應調整
2.官方案例不好使:JitPack的官方案例為 multi-flavor-lib-demo ,2018年最後一次更新,其使用的 gradle 版本相對較低,當前的gradle版本無法使用。
以上兩點,可能是網路文章質量較低的主要原因,因此這裡將我兩天來的學習成果分享給朋友們,幫助大家節省一些時間。

Android應用開發過程中,開發者通常通過 gradle dependencies 匯入第三方依賴庫,那麼當開發者的SDK中介軟體被其他專案依賴時,該如何釋出自己的maven依賴庫呢?
這裡推薦一個Github的構建工具 https://jitpack.io/

  • JitPack 簡介
  • JitPack 使用及案例舉例
  • 案例原始碼下載

一、JitPack簡介

JitPack一 個構建與釋出 Git 儲存庫的便捷服務可用於在 GitHub、GitLab 上打包、釋出與部署依賴庫便於使用者通過maven依賴的形式參照開發者釋出的依賴庫

  • JitPack 允許開發者將 GitHub、GitLab上的JVMAndroid 專案釋出到 Jitpack 的 Maven 倉庫
  • JitPack 通過搜尋開發者輸入的git倉庫連結地址的形式,自動查詢Git上的工程程式碼,並進行自動打包、構建依賴庫(對於開發者來說,基本實現了一鍵釋出依賴庫);
  • JitPack 允許開發者將 Git 儲存庫(包括儲存庫的任何一個分支分支的某一次commit提交)以不同版本的形式進行構建、釋出為maven依賴庫,便於開發者進行版本釋出與維護;
  • 使用價格方面,對於開源專案 JitPack 是完全免費的

二、JitPack 使用

設定jitpack需採用gradle API編寫設定指令碼,隨著gradle版本的更新,相關API及使用方式也有了一定的變化。
這裡分別基於 gradle 6.1gradle 7.5 舉例 jitpack 多渠道釋出。

  • gradle 6.1 設定 JitPack
  • gradle 7.5 設定 JitPack

2.1 gradle6.1設定JitPack

舉例程式碼中使用的 gradle版本 與 外掛版本 如下:
gradle版本https://services.gradle.org/distributions/gradle-6.1.1-all.zip
外掛版本com.android.tools.build:gradle:3.6.1

舉例程式碼中 jitpack 編譯結果:
https://javadoc.jitpack.io/com/github/AndroidAppCodeDemo/jitpack_MultiFlavorLibDemo/gradle_6_1-SNAPSHOT/

下邊通過以下兩個方面進行詳細說明:

  • gradle 6.1 使用 jitpack 進行多渠道 Maven 依賴庫釋出詳細舉例說明;
  • 如何參照 jitpack Maven釋出的多渠道依賴庫?

2.1.1 jitpack多渠道設定

gradle 6.1 使用 jitpack 進行多渠道 Maven 依賴庫釋出詳細舉例說明:
假定 要釋出的庫 其渠道設定資訊如下:

// 渠道舉例
flavorDimensions "vendor"
productFlavors {
	production {
		dimension "vendor"
		buildConfigField 'String', 'ENV', '"PRODUCTION"'
	}
	sandbox {
		dimension "vendor"
		buildConfigField 'String', 'ENV', '"SANDBOX"'
	}
}
  • 首先,需新增 android-maven-gradle-plugin外掛:
    在Android工程根目錄build.gradle中,新增 android-maven-gradle-plugin外掛。
buildscript {
    dependencies {
        // 1、新增 android-maven-gradle-plugin
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
    }
}
  • 新增 釋出渠道包設定
    按照如下程式碼舉例,在對應Module工程build.gradle新增如下4步設定
// 2、應用外掛
apply plugin: 'com.github.dcendents.android-maven'
android {
	// ...
    // 3、預設釋出渠道
    defaultPublishConfig "productionRelease"
    // 4、true to publish all flavour artifacts
    publishNonDefault true
}
// 5、新增「釋出多渠道依賴包設定」
if (android.productFlavors.size() > 0) {
    android.libraryVariants.all { variant ->
        if (variant.name.toLowerCase().contains("debug")) {
            return
        }
        def bundleTask = tasks["bundle${variant.name.capitalize()}Aar"]
        artifacts {
            archives(bundleTask.archivePath) {
                classifier variant.flavorName
                builtBy bundleTask
                name = project.name
            }
        }
    }
}

以上的5個步驟參考了 jitpack-io官方 multi-flavor-lib-demo 樣例工程

2.1.2 參照 jitpack 釋出的多渠道依賴庫

在上一步中,我們順利釋出了 maven 依賴庫,這裡記錄一下如何使用我們釋出的依賴庫?

  • 在Android工程根目錄build.gradle新增 jitpack 倉庫地址
allprojects {
	repositories {
		// 1、新增 jitpack 倉庫地址
		maven { url 'https://jitpack.io' }
	}
} 
  • 在對應Android工程參照依賴包的Module新增如下依賴
dependencies {
	// 2、新增庫檔案依賴:
	// implementation "com.github.<USER>.<REPO>:<library-module>:<version>:<flavor-name>@aar"
	// production 渠道  
 	implementation 'com.github.AndroidAppCodeDemo:jitpack_MultiFlavorLibDemo:gradle_6_1-SNAPSHOT:production@aar' 
 	// sandbox 渠道  
 	implementation 'com.github.AndroidAppCodeDemo:jitpack_MultiFlavorLibDemo:gradle_6_1-SNAPSHOT:sandbox@aar' 
}

2.2 gradle7.5設定JitPack

舉例程式碼中使用的 gradle版本 與 外掛版本 如下:
gradle版本https://services.gradle.org/distributions/gradle-7.5-bin.zip
外掛版本com.android.tools.build:gradle:7.4.1

舉例程式碼中 jitpack 編譯結果:
https://javadoc.jitpack.io/com/github/AndroidAppCodeDemo/jitpack_MultiFlavorLibDemo/gradle_7_5-SNAPSHOT/

下邊通過以下兩個方面進行詳細說明:

  • gradle 7.5 使用 jitpack 進行多渠道 Maven 依賴庫釋出詳細舉例說明;
  • 如何參照 jitpack Maven釋出的多渠道依賴庫?

2.2.1 jitpack多渠道設定

gradle 7.5 使用 jitpack 進行多渠道 Maven 依賴庫釋出詳細舉例說明(假定 仍採用上一步案例中的渠道設定資訊):

  • 應用 maven-publis 外掛:
    根據 android developer:Maven Publish 中介紹,Android gradle 外掛3.6以上版本可以應用 Maven Publish外掛:

    因此,在對應工程要釋出的依賴Module新增如下設定
plugins {
	// 1、新增 maven-publish
    id 'maven-publish'
}
  • 新增 釋出渠道包設定
    釋出渠道依賴包的設定資訊,主要是參考Android Developer Gradle-API-7.1 LibraryPublishing:

    在對應工程要釋出的依賴Module新增如下設定
android {
    // 2、預設渠道
    defaultPublishConfig "productionRelease"
    // 3、釋出渠道設定
    publishing {
        // Publishes all build variants with "vendor" component
        multipleVariants("vendor") {
        	// 只發布release包
            includeBuildTypeValues("release")
            includeFlavorDimensionAndValues("vendor", "production","sandbox")
        }
    }
}

// 4、依賴包釋出設定資訊
afterEvaluate {
    publishing {
        publications {
            allVariants(MavenPublication) {
                // 釋出後的依賴包按如下設定進行參照:com.github.AndroidAppCodeDemo:jitpack_MultiFlavorLibDemo:1.0.2
                from components.vendor // 表示釋出 release
                groupId = 'com.github.AndroidAppCodeDemo' // 這個是依賴庫的組 id
                artifactId = 'jitpack_MultiFlavorLibDemo' // 依賴庫的名稱
                version = "1.0.2"     // 當前版本依賴庫版本號
            }
        }
        repositories {
            maven {
                def baseUrl = buildDir.getParent()
                def releasesRepoUrl = "$baseUrl/repos/releases"
                def snapshotsRepoUrl = "$baseUrl/repos/snapshots"
                url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
            }
        }
    }
}
// 5、生成source jar
task generateSourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier 'sources'
}

2.2.2 參照 jitpack 釋出的多渠道依賴庫

在上一步中,我們順利釋出了 maven 依賴庫,這裡記錄一下如何使用我們釋出的依賴庫?

  • 在Android工程根目錄build.gradle新增 jitpack 倉庫地址
allprojects {
	repositories {
		// 1、新增 jitpack 倉庫地址
		maven { url 'https://jitpack.io' }
	}
} 
  • 在對應Android工程參照依賴包的Module新增如下依賴
dependencies {
	// 2、新增庫檔案依賴:
	// implementation "com.github.<USER>.<REPO>:<library-module>:<version>:<flavor-name>@aar"
	// production 渠道  
 	implementation 'com.github.AndroidAppCodeDemo:jitpack_MultiFlavorLibDemo:gradle_7_5-SNAPSHOT:production@aar' 
 	// sandbox 渠道  
 	implementation 'com.github.AndroidAppCodeDemo:jitpack_MultiFlavorLibDemo:gradle_7_5-SNAPSHOT:sandbox@aar' 
}

三、案例原始碼

本文所使用的案例工程 下載地址 如下:
https://download.csdn.net/download/aiwusheng/87473529

原始碼中包含兩個案例,分別對應Gradle 6.1與Gradle 7.5兩個版本:

  • jitpack_MultiFlavorLibDemo_gradle_6_1
  • jitpack_MultiFlavorLibDemo_gradle_7_5

參考

jitpack-io官方multi-flavor-lib-demo:
https://github.com/jitpack-io/multi-flavor-lib-demo

jitpack-io官方jitpack-android-sample:
https://github.com/jitpack-io/jitpack-android-sample

android developer 使用 Maven Publish 外掛:
https://developer.android.google.cn/studio/build/maven-publish-plugin?hl=zh-cn

android developer gradle-api-7.1:
https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/dsl/LibraryPublishing

android developer gradle-api-8.0:
https://developer.android.google.cn/reference/tools/gradle-api/8.0/com/android/build/api/dsl/LibraryPublishing

android developer 設定釋出內容變體:
https://developer.android.google.cn/studio/publish-library/configure-pub-variants?hl=zh-cn

gradle docs publishing_maven:
https://docs.gradle.org/current/userguide/publishing_maven.html

= THE END =

文章首發於公眾號」CODING技術小館「,如果文章對您有幫助,歡迎關注我的公眾號。