I.はじめに
コンポーネントを作成し、それをオープンソースにしてより多くの人が共有して使用できるようにしたい場合、オープンソース コンポーネントを Jitpack、JenCenter、MavenCentral などのパブリック リモート ウェアハウスに公開する必要がある場合があります。その中で、MavenCentral は最も人気のある中央リポジトリであり、Gradle によって使用されるデフォルト リポジトリの 1 つです。この記事では、独自のオープンソース コンポーネントを MavenCentral リポジトリに公開する方法を紹介します。
2つの用語の説明
2.1 POMとは何ですか?
POM (Project Object Model) は、プロジェクト オブジェクト モデルを指し、プロジェクト コンポーネントの基本情報を記述するために使用されます。有効な POM ノードには主に次のパラメータが含まれています。
パラメータ | 説明 | 例 |
---|---|---|
グループID | 組織・会社名 | io.github.lucasxu01 |
アーティファクトID | コンポーネント名 | モジュラーネットワークビューアプラグイン |
バージョン | コンポーネントのバージョン | 0.0.1 |
梱包 | フォーマット | 瓶 |
2.2 リポジトリとは
プロジェクト内で依存する必要があるさまざまなサードパーティ ライブラリは特定の場所に保存されており、この「場所」が倉庫です。ウェアハウスを使用すると、jar、aar などのプロジェクト成果物を管理するのに役立ちます。
主流のビルド ツールには、次の 2 レベルのウェアハウス概念があります。
-
1. ローカル ウェアハウス:ローカル オペレーティング システムには、中央ウェアハウスまたはリモート ウェアハウスからダウンロードされた依存ファイルを保存するディレクトリがあります。
-
2. リモート倉庫:中央倉庫とプライベート倉庫を含む。中央ウェアハウスは、オープン ソース コミュニティによって提供されるウェアハウスで、ほとんどのオープン ソース ライブラリがここに保存されます。たとえば、 Maven Central ( Maven コミュニティの中央倉庫) ; プライベート 倉庫は、企業または組織のカスタム 倉庫であり、セカンド パーティ ライブラリの保管場所として理解できます。
ワンパーティ ライブラリ: このプロジェクト内で相互に依存するモジュール;
ツーパーティ ライブラリ: 社内の依存関係ライブラリ、一般に社内の他のプロジェクトによってリリースされた jar パッケージを指します; スリーパーティ ライブラリ: 社外のオープン ソース ライブラリ (Apache、
ibm、google などによってリリースされた依存関係など)。
2.3 Sonatype、Nexus、Maven の関係:
- Sonatype:正式名は Sonatype OSSRH (OSS Repository Hosting) です。Sonatype は、米国のオープン ソース DevOps サービス プロバイダーです。オープン ソース コンポーネント (中央ウェアハウス) をサポートし、開発者にリソース ライブラリ マネージャー (Nexus) を提供し、オープン ソース プロジェクトに無料の中央ストレージ ウェアハウス サービスを提供します。
- Nexus:正式名は Sonatype Nexus Repository Manager で、ウェアハウス マネージャーを提供する Sonatype の別の製品です。Sonatype は Nexus に基づいた中央倉庫を提供しており、企業は Nexus を使用してプライベート 倉庫を構築することもできます。
- Maven:正式名は Apache Maven で、ビルド システムです。Maven に加えて、Apache Ant と Gradle の両方でもコンポーネントを公開できます。
3 つの新しい Sonatype プロジェクト
コンポーネントを中央リポジトリに公開するには、Sonatype JIRA アカウントが必要です。
3.1 Sonatype JIRA アカウントの準備
Sonatype ダッシュボード インターフェイスに入り、ログインするか、新しいアカウントを登録します: issues.sonatype.org :
3.2 新しい作業指示を作成する
ダッシュボード パネルの右上隅にある[新規]ボタンをクリックし、以下の手順に従って新しいプロジェクトの作業指示書を Sonotype に送信します。
充填方法をまとめると次のようになります。
-
プロジェクト:デフォルト オプションのコミュニティ サポート - オープン ソース プロジェクト リポジトリ ホスティング (OSSRH) を使用します。
-
質問の種類:デフォルト オプションの [新しいプロジェクト] を使用します。
-
概要:簡単に検索できるように、Github ウェアハウスと同じ名前を入力します。
-
GroupId 組織名:
コンポーネントを公開するときに使用する groupId を入力します。次のステップで、実際に groupId を所有しているかどうかを確認するため、ただ入力するだけでは済みません。入力する方法は 2 つあります。
- **Github アカウントを使用する: **
io.github.[Github 用户名]
の形式に入力すると、その後の手順で、Sonatype は個人の Github ウェアハウスに指定された名前の一時的なコード ライブラリを作成するよう要求することによって本人確認を行います。 - 個人のドメイン名を使用する:ドメイン名の形式に従って逆の順序で入力します。たとえば、個人のドメイン名が の場合は
oss.sonotype.org
入力しますorg.sonotype.oss
。
- **Github アカウントを使用する: **
-
プロジェクト URL プロジェクト アドレス: Github プロジェクト アドレスを入力します。例:
https://github.com/lucasxu01/NetworkViewer
; -
SCM URL バージョン管理アドレス: Github プロジェクト アドレスの後に追加します
.git
(例: )https://github.com/lucasxu01/NetworkViewer.git
。
2.3 GroupId の所有権を確認する
新しいプロジェクトを作成した後、プロンプトに従ってクリックして作業指示書の詳細ページに入ります。新しく作成された作業指示書は Sonotype ロボットからの応答を待つ必要があります。約 10 分待つと、作業指示書の下部にあるコメント領域に次に何をすべきかが表示されます。
この時点で、Sonotype プロジェクトの準備が整いました。
4 新しい GPG キーペアを作成します
GPG (GNU Privacy Guard) は、 OpenPGP 標準に基づいて実装された暗号化ソフトウェアであり、ファイルの非対称暗号化と署名検証機能を提供します。Maven ウェアハウスに公開されるすべてのファイルは、ファイルの正当性を検証するために GPG 署名される必要があります。
3.1 GPG ソフトウェアをインストールする
GPG ソフトウェアをインストールします。
# 通过 Homebrew 安装 gpg
brew install gpg
brew をインストールします: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
インストールが成功したことを確認します: brew -v
3.2 GPG キーペアの生成
パラメータを使用し--generate-key
、ガイドラインに従って関連情報とパスフレーズ秘密キーのパスワードを入力します。さらに、--list-keys
パラメータを使用して、現在のシステムで生成されたキーを表示します。
# 密钥生成命令
gpg --generate-key
# 密钥查看命令
gpg --list-keys
GPG がキー ペアを生成するとき、開発者は乱数に十分な摂動を加えるためにいくつかのランダムなアクションを実行する必要があり、生成はしばらくして完了します。完了後、—list-keys
パラメーターを使用していつでもキー ペア情報を表示できます。
その中の情報を説明すると、次のようになります。
➜ ~ gpg --list-keys
/Users/a58/.gnupg/pubring.kbx
-----------------------------
pub ed25519 2022-09-05 [SC] [有效至:2024-09-04]
F740E820EFE033F*******************7F3C8
uid [ 绝对 ] LucasXu <[email protected]>
sub cv25519 2022-09-05 [E] [有效至:2024-09-04]
# pubring.kbx:本地存储公钥的文件
# 2022-09-05 [SC] [expires: 2024-09-04]:表示密钥对的创建时间和失效时间
# LucasXu <[email protected]>:用户名和邮箱
# ed25519:表示生成公钥的算法
# cv25519:表示生成私钥的算法
# F740E820EFE033F*******************7F3C8:密钥指纹 / KeyId
これまでのところ、ローカルで多数の新しいキー ペアを生成し、次のものが完成しました。
- キー フィンガープリント/KeyId:キー フィンガープリントは、キー ペアの一意の識別子、つまり
F740E820EFE033F*******************7F3C8
上記の文字列です。場合によっては、最後の 8 文字、つまり***7F3C8
この文字列を取得する、より短い形式も使用できます。 - 公開鍵:鍵のフィンガープリントに対応する公開鍵。
- 秘密鍵:キーのフィンガープリントに対応する秘密鍵。
- パスフレーズ キー パスワード:キー ペアの生成時に入力されたパスワード、秘密キー、およびキー パスワードは合わせてキー ペアの秘密情報を構成します。
3.3 キーペアの削除
場合によっては、キー ペアを削除する必要がある場合は、次のコマンドを使用できます。
# 先删除私钥后,才能删除公钥
# 删除私钥
gpg --delete-secret-keys [密钥指纹]
# 删除公钥
gpg --delete-keys [密钥指纹]
3.4 公開鍵のアップロード
他の人が署名したデータを検証するために公開鍵を取得できるように、鍵ペアの公開鍵情報を公開する必要があります。公開方法は、公開鍵サーバーに公開鍵をアップロードすることです。公開キー サーバーは、ユーザーの公開キーの保存専用のサーバーであり、交換メカニズムを使用してデータを他の公開キー サーバーと同期するため、いずれかのサーバーにアップロードするだけで済みます。ようやくhkp://keyserver.ubuntu.com
サーバーにアップロードできました。次のサーバーを試すことができます。
pool.sks-keyservers.net
keys.openpgp.org
keyserver.ubuntu.com
pgp.mit.edu
// 上传公钥
gpg --keyserver 【服务器地址】:11371 --send-keys 【密钥指纹】
// 验证公钥
gpg --keyserver 【服务器地址】:11371 --recv-keys 【密钥指纹】
gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys F740E820EFE033F*******************7F3C8
3.5 キーファイルのエクスポート
後でコンポーネントを公開するときにキーのパスワードと秘密キー ファイルが必要になり、次のパラメータを使用してエクスポートできます。
# 默认导出到本地目录 /User/[用户名]/
# 导出公钥
gpg --export 【密钥指纹】 > xiaopeng_pub.gpg
# 导出私钥
gpg --export-secret-keys 【密钥指纹】 > xiaopeng_pri.gpg
5つの構成リリーススクリプト
Sonatype プロジェクトとキー ペアの準備ができたら、プロジェクトの Gradle スクリプトを構成します。Gradle は 2 つの Maven プラグインを提供します。
- Maven プラグイン:古いリリースのプラグイン。Gradle 7.0 以降は利用できません。
- maven-publish プラグイン:新しいリリースのプラグイン。
vanniktech のパブリッシング プラグインを使用することをお勧めします。gradle -maven-publish-plugin は、海外の大物 vanniktech によるオープンソースの Gradle プラグインであり、Gradle 7.2.0 以降の Gradle 環境が必要です。これは、Java、Kotlin、または Android コンポーネントを任意の Maven リポジトリに公開することをサポートする公開タスクを作成します。また、Java / Kotlin コードを運ぶ Javadoc 製品および Sources 製品の公開もサポートします。現在 (2022/09/26) のこのプロジェクトの最新バージョンは 0.22.0 で、LeakCanary で検証されています。
5.1 vanniktechプラグイン環境の構成
構成手順は次のとおりです。build.gradle
プロジェクト レベルでプラグイン アドレスを追加し、モジュール レベルの build.gradle でプラグインを適用します。
プロジェクトレベルの build.gradle
buildscript {
repositories {
mavenCentral()
}
dependencies {
// vanniktech 发布插件
classpath 'com.vanniktech:gradle-maven-publish-plugin:0.18.0'
// Kotlin Javadoc,非必须
classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.6.20"
}
}
最新バージョンの build.gradle は次のように書かれています。
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
dependencies {
// vanniktech 发布插件
classpath 'com.vanniktech:gradle-maven-publish-plugin:0.18.0'
// Kotlin Javadoc,非必须
classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.6.20"
//1、依赖抓包插件库
classpath 'io.github.lucasxu01:modular-networkviewer-plugin:0.0.1'
}
}
plugins {
id 'com.android.application' version '7.3.0-beta01' apply false
id 'com.android.library' version '7.3.0-beta01' apply false
id 'org.jetbrains.kotlin.android' version '1.6.21' apply false
}
モジュールレベルの build.gradle
apply plugin: "com.vanniktech.maven.publish"
// Kotlin Javadoc,非必须。如果有这个插件,发布时会生成 Javadoc,会延长发布时间。建议在 snapshot 阶段关闭
apply plugin: "org.jetbrains.dokka"
build.gradle の最新バージョンは次のように書かれています::
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'monitor-plugin'
}
同期プロジェクトの後、プラグインは 2 つの Task タスクをモジュールに追加します。
- 公開:リモート Maven リポジトリに公開します。デフォルトは Sonatype 中央リポジトリです。
- publishToMavenLocal:現在のマシンのローカル Maven リポジトリ、つまり に公開します
~/.m2/repository
。
グラドルパネル:
- 公開: リモート Maven リポジトリに公開します。
- ローカルの Maven ウェアハウスに公開します。
5.2 vanniktechプラグインリリースパラメータ設定
次のパラメータをプロジェクト レベルgradle.properties
とモジュール レベルでそれぞれ設定します。gradle.properties
アイテムレベルgradle.properties
:
######################################################################
# for vanniktech
######################################################################
# 服务器地址
SONATYPE_HOST=S01
# 发布 release 组件时是否签名
RELEASE_SIGNING_ENABLED=true
# 组织名
GROUP=io.github.lucasxu01
# 主页
POM_URL=https://github.com/LucasXu01/NetworkViewer/
# 版本控制信息
POM_SCM_URL=https://github.com/LucasXu01/NetworkViewer/
POM_SCM_CONNECTION=scm:git:git:github.com/LucasXu01/NetworkViewer.git
POM_SCM_DEV_CONNECTION=scm:git:ssh://[email protected]/LucasXu01/NetworkViewer.git
# Licenses 信息
POM_LICENSE_NAME=The Apache Software License, Version 2.0
POM_LICENSE_URL=https://www.apache.org/licenses/LICENSE-2.0.txt
POM_LICENSE_DIST=repo
# 开发者信息
POM_DEVELOPER_ID=LucasXu01
POM_DEVELOPER_NAME=LucasXu
POM_DEVELOPER_URL=https://github.com/LucasXu01/
mavenCentralUsername=[填 Sonatype 账号名]
mavenCentralPassword=[填 Sonatype 账号密码]
signing.keyId=[密钥指纹,取后 8 位即可, 如 E4F7F3C8]
signing.password=[passphrase 密钥口令]
signing.secretKeyRingFile=[导出的私钥文件路径,如 /Users/a58/lucas_pri.gpg]
モジュールレベルgradle.properties
:
POM_NAME = network_viewer_plugin
POM_ARTIFACT_ID = modular-networkviewer-plugin
POM_PACKAGING = jar
POM_DESCRIPTION = The plugin used in NetworkViewer api
VERSION_NAME = 0.0.1
local.properties
特別な注意: 個人情報を git バージョン管理に送信しないでください。コンポーネントをリリースするときに書き込んでコピーできますgradle.properties
。また、秘密キー ファイルは現在のプロジェクトのディレクトリに保存する必要はありませんが、プロジェクトの外部のディレクトリに配置することができます。
この時点で、すべての準備は完了です。
6 つのコンポーネントを MavenCentral リポジトリに公開
ついにすべての準備と設定が完了しました。公開する前に、Sonatype で使用されるウェアハウスのアドレスを説明する必要があります。
6.1 倉庫の住所
カスタムで公開された Maven リポジトリがない場合、vanniktech プラグインはデフォルトで Sonatype によって管理される中央リポジトリに公開されます。歴史的な理由から、Sonatype 中央倉庫には 2 つのドメイン名があります。
公式声明によると、oss.sonatype.org は廃止され、2021 年 2 月から有効になります s01.oss.sonatype.org/
6.2 一時ストレージライブラリのステージング
注意深い人は、公式スナップショット ウェアハウスとリリース ウェアハウスの形式が異なることに気づくでしょう。なぜでしょうか? ——これは、リリース コンポーネントのリリースは機密性の高い操作であるためです。コンポーネントのリリース バージョンが中央ウェアハウスにリリースされると、このバージョンのコンポーネントのコンテンツは決して変更または削除できなくなります (このルールは安定性と信頼性を考慮したものです。変更できる場合、コンポーネントをローカルにダウンロードしたユーザーは最新のコンテンツを取得できなくなります)。そのため、Sonatype は、スナップショット コンポーネントの公開とコンポーネントのリリースにさまざまな戦略を採用しています。
- スナップショット コンポーネント:スナップショット中央ウェアハウスに直接公開します。
- リリース コンポーネント:ステージング一時ストレージ戦略を使用すると、まずリリース コンポーネントを一時ストレージ ライブラリに公開する必要があり、テストと検証に合格した後、開発者はそれをリリース中央ウェアハウスに手動でアップグレードします。
中央 release 仓库:"https://s01.oss.sonatype.org/content/repositories/releases"
中央 snapshot 仓库:"https://s01.oss.sonatype.org/content/repositories/snapshots"
暂存库:"https://s01.oss.sonatype.org/service/local/staging/deploy/maven2"
6.3 スナップショットコンポーネントの公開
SNAPSHOT を含むバージョン番号はスナップショット コンポーネントとみなされ、スナップショット中央ウェアハウスに直接リリースされます。フロントエンドがリリースされると、スナップショットの中央ウェアハウスですぐに検索できます。
6.4 リリースコンポーネントをステージングリポジトリに公開する
SNAPSHOT のないバージョン番号はリリース コンポーネントとみなされます。リリース コンポーネントをリリースした後、Nexusパネルに入り、一時ライブラリを表示します (右上隅にログインします)。
6.5 リリースコンポーネントを中央ウェアハウスに公開する
コンポーネントを公開することを確認したら、まず「閉じる」をクリックし、次に「リリース」をクリックして公開します。
Close プロセスではコンポーネントが検証され、検証が失敗した場合はエラーが報告されます。エラー メッセージは、[アクティビティ] パネルから直接表示できます。
「リリース」の右側にある「ドロップ」ボタンをクリックして、問題のあるコンポーネントを削除します。
6.6 リリースされたリリースコンポーネントを表示する
公開が成功した後、独自のコンポーネントを表示するには 3 つの方法があります。
- 方法 1 - Sonatype Nexus パネルで表示します。
- 方法 2 - リリース中央ウェアハウスのファイル ディレクトリ ( modular-networkviewer-pluginなど) を表示します。
- 方法 3 - MavenCentral 検索バーで検索: これは最も公式な方法ですが、最初の 2 つの方法はリリース直後に更新されるのに対し、リアルタイムでは更新されず遅延が生じるという欠点があります。
公式声明によると、リリースされたコンポーネントは30分以内に中央倉庫に同期されますが、検索機能には4時間かかる必要があります。
7 つはテストのためにコンポーネントをローカル ウェアハウスに公開します
5.1 では、gradle パネルをクリックしてpublishToMavenLocal
プラグインをローカルに公開し、共同デバッグとテストを行うことができます。
パネル内をクリックして、publishToMavenLocal
最初にプラグインをローカル Maven ウェアハウスに公開します。通常、デフォルトのアドレスは次のとおりです。
/Users/a58/.m2/repository
NetworkViewer AS の新しいバージョンsettings.gradle
の構成リファレンス:
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
maven {
url '/Users/a58/.m2/repository' }
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven {
url '/Users/a58/.m2/repository' }
}
}
rootProject.name = "NetworkViewer"
include ':app'
include ':okhttpplugin'
include ':netviewer'
依存するウェアハウスをローカルに公開して追加した後、NetworkViewer のプロジェクト レベルのbuild.gradle
構成は次のように参照されます。
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
dependencies {
// vanniktech 发布插件
classpath 'com.vanniktech:gradle-maven-publish-plugin:0.18.0'
// Kotlin Javadoc,非必须
classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.6.20"
//1、依赖抓包插件库
classpath 'io.github.lucasxu01:modular-networkviewer-plugin:0.0.1'
}
}
plugins {
id 'com.android.application' version '7.3.0-beta01' apply false
id 'com.android.library' version '7.3.0-beta01' apply false
id 'org.jetbrains.kotlin.android' version '1.6.21' apply false
}
アプリレベルのbuild.gradle
構成にプラグインを追加した後、ローカルでテストできます。
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'monitor-plugin'
}
8 つは公開されたコンポーネントに依存します
これはリリース中央倉庫にリリースされており、プロジェクトにはmavenCentral()
この倉庫アドレスのみを含める必要があることに注意してください。
repositories {
// 中央仓库(不包含 snapshot 中央仓库)
mavenCentral()
// release 中央仓库
maven { url 'https://s01.oss.sonatype.org/content/repositories/releases'}
// snapshot 中央仓库
maven { url 'https://s01.oss.sonatype.org/content/repositories/snapshots/'}
// 暂存库,用于验证
maven { url "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2"}
}
詳細については、 NetViewerを参照してください。
9人はSonatypeに公式の助けを求めている
Sonatype の使用中に問題が発生した場合は、公式に質問してみてください。通常、10分以内に返信がございます。
十の見通し
Github Action: 現在、オープンソース プロジェクトを MavenCentral 中央ウェアハウスに公開できます。ただし、各リリースではアップロード タスクを手動で実行する必要があり、Github リポジトリの [リリース] パネルには手動でリリースされたバージョン レコードが同期的に表示されません。望ましい効果は、リリース バージョンが Github リポジトリでリリースされると、MavenCentral 中央リポジトリへのバージョンのリリースが自動的にトリガーされることです。これには、Github によって提供される CI/CD サービス - Github Action が必要です。
参考記事
https://blog.csdn.net/hanly_jiang/article/details/123123111
https://juejin.cn/post/7135457823055413278
https://github.com/Leaking/Hunter/blob/master/docs/README_ch.md