运用 Jitpack 发布你的 Android 库

在开发 Android 应用时,咱们经常会把一些通用的代码抽取出来,打包成一个库,方便在其他项目中运用。这时分,咱们就需求把这个库发布到某个地方,方便其他项目引证。你一定在 build.gradle 中看到过这样的代码:

dependencies {
    implementation("<group>:<artifact>:<version>")
}

这儿介绍一种简单的方法,运用 Jitpack 发布你的 Android 库。

什么是 Jitpack?

Jitpack 是一个根据 GitHub 的主动化构建东西,它能够帮助你将 GitHub 上的项目构建成一个 Maven 库房,方便其他项目引证。

立刻着手

已然要发布库,那么首先你需求有一个库,新建一个 Android 项目,在 Android Studio 中切换到 Project 视图,现在咱们有一个 app 模块。右键项目新建一个 module,挑选 Android Library,命名为 mylibrary ,这个模块便是咱们要发布的库。

在库里新建一个单例类:

object MyLibrary {
    fun getMessage() = "Hello from MyLibrary!"
}

mylibrary 的 build.gradle.kts 中引进 mavenpublish 插件

plugins {
    id("com.android.library")
    id("kotlin-android")
    id("maven-publish") // 引进 maven 插件
}

咱们还要在 mylibrary 的 build.gradle.kts 中增加发布装备
(我这儿运用的是 Kotlin DSL,如果你运用的是 Groovy DSL,请自行转换或许挑选将 build 装备从 Groovy 迁移到 KTS)

val GROUP_ID = "com.github.bqliang"
val ARTIFACT_ID = "jitpack-lib-sample"
val VERSION = latestGitTag().ifEmpty { "1.0.0-SNAPSHOT" }
fun latestGitTag(): String {
    val process = ProcessBuilder("git", "describe", "--tags", "--abbrev=0").start()
    return  process.inputStream.bufferedReader().use {bufferedReader ->
        bufferedReader.readText().trim()
    }
}
publishing { // 发布装备
    publications { // 发布的内容
        register<MavenPublication>("release") { // 注册一个名字为 release 的发布内容
            groupId = GROUP_ID
            artifactId = ARTIFACT_ID
            version = VERSION
            afterEvaluate { // 在所有的装备都完结之后履行
                // 从当前 module 的 release 包中发布
                from(components["release"])
            }
        }
    }
}

这儿咱们运用了 latestGitTag() 方法来获取 git 库房中最新的 tag作为版本号。如果没有 tag,那么就运用 1.0.0-SNAPSHOT 作为版本号。

现在,咱们就能够在 Android Studio 中点击 mylibrary 的右侧的 Gradle 选项卡,找到 publishToMavenLocal 使命,双击运转,就能够将 mylibrary 发布到本地的 Maven 库房中。

咱们已经将 mylibrary 发布到了本地的 Maven 库房中,现在咱们能够在 app 模块中引证它了。在 app 的 build.gradle.kts 中增加依赖:

dependencies {
    implementation("com.github.bqliang:jitpack-lib-sample:1.0.0-SNAPSHOT")
}

这儿的 com.github.bqliang:jitpack-lib-sample:1.0.0-SNAPSHOT 便是咱们在 mylibrary 的 build.gradle.kts 中装备的 <GROUP_ID>:<ARTIFACT_ID>:<VERSION>,如果咱们后续要发布新的版本,只需求给 git 库房打一个 tag,然后从头运转 publishToMavenLocal 使命,就能够将新版本发布到本地的 Maven 库房中了。当然,你如果不喜欢运用 git tag 作为版本号,也能够直接在 mylibrarybuild.gradle.kts 中写死版本号。

由于是从本地的 Maven 库房中引证,所以咱们还需求在项目的 settings.gradle.kts 中增加本地 Maven 库房地址:

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        ...
        mavenLocal()
    }
}

Sync 一下项目,就能够在 app 模块中运用 MyLibrary 了:

fun main {
    println(MyLibrary.getMessage())
}

由于咱们的库和 app 是在同一个项目中,所以其实咱们能够直接在 app 模块中引证 mylibrary

dependencies {
    implementation(project(":mylibrary"))
    // implementation("com.github.bqliang:jitpack-lib-sample:1.0.0-SNAPSHOT")
}

这在调试修正库的时分会十分方便,由于咱们能够直接在 app 模块中调试库的代码而不需求每次都 publish 一下。

等等,咱们如同忘了什么?对了,咱们还没有发布到 Jitpack 上呢!
把库房推送到 GitHub 上,然后打开 Jitpack 官网,输入 输入<GitHub用户名>/<库房名> 搜索你的库房(留意库房可见性要设置为 public),点击 Get it,就能够看到引证的方法了:

dependencies {
    implementation("com.github.<GitHub用户名>:<库房名>:<版本号>")
}

现在,咱们就能够在任何项目中运用咱们的库了!

留意不要忘了在项目的 settings.gradle.kts 中增加 Jitpack 的库房地址:

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        ...
        maven(url = "https://jitpack.io")
    }
}

留意!implementation("com.github.<GitHub用户名>:<库房名>:<版本号>") 这儿的版本号不是咱们在 mylibrarybuild.gradle.kts 中装备的版本号。<GitHub用户名><Github库房名> 和咱们在 mylibrarybuild.gradle.kts 中装备的 <GROUP_ID><ARTIFACT_ID>当然也不是同样的东西。

其实在 Get it 的时分,咱们能够挑选 release 或许 branch 或许 commit id,如果挑选了 release,那么版本号便是 release 的 tag,如果挑选了 branch,那么版本号便是 <分支名-SNAPSHOT>,如果挑选了 commit id,那么版本号便是 commit id。

留意 SNAPSHOT 版本的缓存问题,咱们能够在 build.gradle.kts 中增加以下装备来解决:

configurations.all {
    resolutionStrategy.cacheChangingModulesFor(0, "seconds")
}

咱们还能够运用 GitHub Action 完成推送 tag 时主动发布 Github Release,然后触发 Jitpack 的构建。
在项目的根目录下创建 .github/workflows/release.yml 文件:

name: publish release
on:
  push:
    tags:
      - "*"
jobs:
    release:
      runs-on: ubuntu-latest
      permissions:
        contents: write
      steps:
        - uses: ncipollo/release-action@v1
          with:
            generateReleaseNotes: true

这样,每当咱们推送 tag 的时分,GitHub Action 就会主动发布 Release,然后触发 Jitpack 的构建,最终就能够在任何项目中运用咱们的库了。