打包Maven库
在日常使用中,我们经常需要打包 Maven 库,以便在其他项目中使用。这里记录一下打包 Maven 库的过程。
1. 使用 GitHub Packages
平日里有许多项目都是使用 GitHub 来托管代码的,而 GitHub 也提供了 Maven 库的服务,因此我们可以使用 GitHub Packages 来打包 Maven 库。
1.1 创建 Token
首先我们需要创建一个 Token,用于后续的操作。在 GitHub 的设置中,找到 Developer settings,然后点击 Personal access tokens,点击 Generate new token,输入 Token 的名称,然后勾选 package read/write,点击 Generate token,这样就创建了一个 Token。
1.2 配置 Gradle
为了能让 Gradle 上传到 GitHub 上去,我们需要配置以下两个环境变量:
TOKEN=
USERNAME=
其中,TOKEN 就是我们刚刚创建的 Token,USERNAME 就是我们的 GitHub 用户名。拿我自己举例
TOKEN=ghp_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
USERNAME=siril11
1.3 配置 GPG
为了能够正确上传 Maven 包,我们需要签署 GPG 密钥。首先我们需要安装 GPG,在 macOS 上,我使用了这个GPG 客户端。 这个客户端配备了非常明了的 GUI 界面可以操作。创建好密钥后,我们需要将它导出出来。导出的格式如下:
-----BEGIN PGP PRIVATE KEY BLOCK
然后,我们需要创建两个环境变量:
ORG_GRADLE_PROJECT_signingInMemoryKey=
ORG_GRADLE_PROJECT_signingPassword=
第一个环境变量就是我们刚刚导出的 GPG 密钥,第二个环境变量就是我们的 GPG 密钥的密码。这两个环境变量来自这个文档。 里面提到:
In some setups it is easier to use environment variables to pass the secret key and password used for signing. For instance, when using a CI server to sign artifacts, securely providing the keyring file is often troublesome. On the other hand, most CI servers provide means to securely store environment variables and provide them to builds. Using the following setup, you can pass the secret key (in ascii-armored format) and the password using the ORG_GRADLE_PROJECT_signingKey
and ORG_GRADLE_PROJECT_signingPassword
environment variables, respectively:
1.4 设置 GitHub Secrets
将上述的四个环境变量添加到 GitHub Secrets 中,这样就可以在 GitHub Actions 中使用了。
1.5 配置需要的包裹使用 GitHub Packages
1.5.1 配置 Maven 仓库
下面的代码是配置 Maven 仓库的代码,我们需要将 USER
和 REPO
替换成我们自己的用户名和仓库名。
publishing {
repositories {
maven {
name = "GitHubPackages"
url = uri("https://maven.pkg.github.com/USER/REPO")
credentials {
username = project.findProperty("gpr.user") ?: System.getenv("USERNAME")
password = project.findProperty("gpr.key") ?: System.getenv("TOKEN")
}
}
}
publications {
gpr(MavenPublication) {
afterEvaluate {
from components.release
}
}
}
}
在使用的时候,将上述代码复制到 build.gradle
中。具体的可以参见这个文档。
注意 ⚠️,上面的代码和 GitHub 官方文档有些许出入。首先,我们在 gpr 中加入了afterEvaluate
原因是如果不加入,
则可能找不到components.release
关键词。具体可以参考这个文档。之后之所以使用components.release
,
而不是使用 GitHub 文档中的components.java
,是因为我在使用components.java
的时候,会报错,原因是我们的项目中没有使用java
插件。
而如果我们加入了java
插件,那么我们的项目就会变成一个java
项目,而不是一个android
项目了。两者冲突。而根据
安卓官方文档中,有写到用components.release
,
所以我们就使用了components.release
。
2. 配置 GitHub Actions
运用下面的代码,我们就可以在 GitHub Actions 中自动上传包到 GitHub Packages 中了。
name: Upload release to GitHub Package
# Run this workflow when a tag is pushed
on:
push:
tags:
- '*'
workflow_dispatch:
jobs:
publish:
name: Release build and updload
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
distribution: adopt
java-version: 11
- name: Make gradlew executable
run: chmod +x ./gradlew
- name: Upload release to GitHub Package
run: ./gradlew publishMavenPublicationToGitHubPackagesRepository --no-daemon --no-parallel
env:
ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.SIGNING_PRIVATE_KEY }}
ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.SIGNING_PASSWORD }}
TOKEN: ${{secrets.RELEASE_TOKEN}}
USERNAME: ${{secrets.GITHUB_ACTOR}}
PublishMavenPublicationToGitHubPackagesRepository
是 GitHub packages 中关键的一部份,不能用 PublishAllPublicationsToGitHubPackagesRepository
,否则会报错。原因是后者会发布多个重复的包,而
GitHub Packages 中只能有一个包。
打包好的包如下:
3. 使用 GitHub Packages
3.1 配置 Maven 仓库
在使用 GitHub Packages 的时候,我们需要在 settings.gradle
中配置 Maven 仓库(android app),如下所示:
pluginManagement {
repositories {
gradlePluginPortal()
maven {
url = uri("https://maven.pkg.github.com/USER/REPO")
credentials {
username = project.findProperty("gpr.user") ?: System.getenv("USERNAME")
password = project.findProperty("gpr.key") ?: System.getenv("TOKEN")
}
}
}
}
3.2 安装包
之后我们就可以在build.gradle
中安装包了,如下所示:
dependencies {
implementation 'com.github.USER:REPO:VERSION'
}
如下图所示,具体的安装方法可以在 GitHub 对应的 package 的详情中找到。