发布组件到GitHub Packages

Posted by Dorck on July 26, 2022

使用过 Maven Central 的朋友应该都体会过组件发布流程的繁琐,于是乎心里萌生了一个想法:是否可以将组件发布到 GitHub 仓库呢?果断去 Google 了一下,果不其然,GitHub 提供了 GitHub Packages 可以让作为开发者组件发布的分发仓库。下面来看下如何具体实现本地 Library 发布到 GitHub Packages 以及在项目中下载依赖库。

GitHub Packages 是一种软件包托管服务,可让您私下或公开托管软件包,并将软件包用作项目中的依赖项。

申请访问令牌

我们可以在 Settings » Developer Settings » Personal access tokens 处申请 GitHub 的访问令牌。对于 GitHub Package 而言,可以分配以下三种访问权限:

权限 访问描述
读取 可以下载包。 可以读取包元数据。
写入 可以上传和下载此包。 可以读取和写入包元数据。
管理员 可以上传、下载、删除和管理此包。 可以读取和写入包元数据。 可以授予包权限。

对于组件发布而言,首先需要具有发布的权限,即“写”的权限,那么我们可以先申请一个拥有写入权限的令牌:

generate_github_write_token

将生成的 Access Token 保存到本地之后,再申请一个访问依赖组件的权限,即能够从 GitHub Packages 下载所需组件:

generate_github_read_token

组件发布到 GitHub Package

实现其实很简单,发布逻辑我封装在一个自定义插件中了,具体实现可以查看源码,这里说一下需要的配置信息。首先,我们需要创建一个用于存储 GitHub Packages 的仓库,例如:Moosphan/MavenRepo,接下来只需要在 local.properties 中添加配置信息:

1
2
3
REPO_USER=<Your_GitHub_Username>
REPO_PASSWORD=<Your_Github_Access_Token>
REPO_RELEASE_URL=https://maven.pkg.github.com/<Your_GitHub_Username>/<Your_GitHub_Repository>

主要包含三个信息:

  • GitHub 用户名,e.g,Moosphan
  • GitHub 申请的具有写权限的令牌,即 Access Token
  • Github Packages 所托管的 Maven 仓库,https://maven.pkg.github.com/ 是固定的,后面紧跟 GitHub 用户名和刚刚创建的仓库名称就可以了。

接下来,我们只需要在待发布组件中引入以下插件:

1
2
3
plugins {
  id("cn.dorck.component.publisher") version "1.0.2"
}

然后增加 DSL 配置如下:

1
2
3
4
5
publishOptions {
    group = "com.dorck.android"
    version = "0.1.0"
    artifactId = "sample-library"
}

随后执行一下 ./gradlew :<component module name>:publishComponent 即可发布。

其实,我们也可以在 publishOptions 中来配置仓库信息,如:

1
2
3
4
5
6
7
8
publishOptions {
    group = "com.dorck.android"
    version = "0.1.0"
    artifactId = "sample-library"
    userName = "Moosphan"
    password = "Your_Access_Token"
    releaseRepoUrl = "https://maven.pkg.github.com/Moosphan/MavenRepo"
}

刚刚之所以在 local.properties 中配置是因为如果我们发布组件比较多时,通常它们的 Repository 是同一个,所以,local.properties 中可做一些全局配置,省去我们重复的配置,提高效率而已。

对于不希望引入第三方插件的用户来说,其实源码实现也很简单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
afterEvaluate {
    publishing {
        publications {
            create<MavenPublication>("mavenPub") {
                group = PluginInfo.group
                artifactId = PluginInfo.artifactId
                version = PluginInfo.version
                from(components["java"])

                pom {
                    //...
                }
            }
        }
        repositories {
            maven {
                url = uri("https://maven.pkg.github.com/Moosphan/MavenRepo")
                credentials {
                        username = "<Your_GitHub_Username>"
                        password = "<Your_Github_Access_Token>"
                    }
            }
        }
    }
}

接下里,不出意外的话,我们可以在先前 GitHub 上创建的托管仓库(e.g. MavenRepo)Packages 中看到自己发布成功的产物了:

github_packages_repo

接下来看下如何在项目中依赖使用发布到 GitHub Packages 的组件。

依赖 Github Packages 托管的组件

AGP 6.8 开始,我们只需要在 settings.gradle 中配置如下仓库源:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
    repositories {
        google()
        mavenCentral()
        maven { url "https://jitpack.io" }
      	// Add Github packages maven repo
        maven {
            name 'GithubRepo'
            url 'https://maven.pkg.github.com/Moosphan/MavenRepo'
            credentials {
                username '<Your_GitHub_Username>'
                password '<Your_Github_Access_Token>'
            }
        }
        mavenLocal()
    }
}

可以看到,所需的信息和上面发布时用到的信息其实大体是一样的,只不过 password 对应的令牌信息是我们具有读权限的令牌。最后,只需要在项目中依赖已发布的组件即可,如:

1
implementation 'com.dorck.android:sample-library:0.1.0'

接下来,可以看到 sample-library 被成功下载和解析,jar/aar 里面的 API 也可成功调用了。


许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。