手把手教你上傳安卓庫到Central Portal

作為一個熱愛編碼的安卓開發(fā),工作這么多年,也喜歡寫點自己愛用的庫,奈何這樣的代碼越寫越多,我就發(fā)現(xiàn)了一個很尷尬的問題。代碼越堆越多,每次全局改點啥,就要挪來挪去。

其實很早之前也想過(并試過)上傳到Maven倉庫,比如本地搭建、阿里云私有的等等。但是都感覺限制性很高,然后也試過上傳到mavenCentral,但是這個弄到一半,中途放棄了。

最近突然又想把這個事情辦完算了,結(jié)果第一步就把我卡住了。

上面是啥意思呢?

簡單來說就是以前的玩法不讓玩了。然后又給了文檔說明。

如果玩的話,要用新的玩法,我們這次,就是手把手教你,最新玩法怎么玩。官方文檔地址:

https://central.sonatype.org/register/legacy/

注冊賬號

按照文檔的意思,我們需要在這個網(wǎng)站注冊登錄

https://central.sonatype.com/

點擊sign in 會出現(xiàn)如下界面:

這里我為了省事,直接選擇用 github 賬號授權(quán)登錄。(在彈窗選擇授權(quán)登錄即可)

登錄成功之后,我們選擇:

正常情況下,新賬號是Namespaces 選項卡下是沒有任何內(nèi)容的(我這里是已經(jīng)注冊好了一個Namespaces)。下一步我們就是去注冊Namespaces。

注冊Namespaces

找到Register New Namespace按鈕,然后點擊它。

會彈出如下界面:

這里我們填入我們的主域名即可。比如我買了個域名 fastcv.cc,那在這里填入cc.fastcv即可。

但是cc.fastcv我已經(jīng)提交并且驗證通過了,這里我就用fastcv.com來做演示。填入com.fastcv并提交之后,我們在Namespace選項卡下可以看到這個內(nèi)容:

在這一步就是需要去驗證這個域名是不是你的。

驗證Namespace

我們點擊Verify Namespace按鈕

這里會給我們一段文本,比如這里的 "ssdiral7je"。

那怎么去驗證呢?按照彈窗的提示,我們需要去我們域名里面創(chuàng)建一個Txt Record。

這是個啥?

以阿里云的域名來說,我們找到我們購買的域名后

點擊進去查找域名解析

然后在域名解析里面找到解析設(shè)置。

再找到添加記錄。

在添加記錄彈窗里面配置如上信息后,再將之前的驗證文本字符串填入到記錄值的文本輸入框里面。最后點擊確定。就會在記錄里面多出一條

這一步配置好之后,我們返回我們之前的這個頁面

點擊Confirm即可,然后等待驗證結(jié)果即可。

怎么上傳庫?

在Namespace驗證通過后,我們就可以準(zhǔn)備去上傳我們的庫文件到Central Portal了。

因為安卓項目現(xiàn)在基本上都是gradle的項目配置。所以感興趣的可以直接去官方文檔看gradle的配置方式。

https://central.sonatype.org/publish/publish-portal-gradle/

在我寫文檔的這個時候,目前還沒有官方出這個gradle插件。但是它推薦了一些用戶自己實現(xiàn)的gradle插件:

這里我選擇的是

地址如下:

https://github.com/yananhub/flying-gradle-plugin

安裝它的說明文檔結(jié)合我的實際情況,我的庫文件module下的gradle配置如下:

plugins {
    alias(libs.plugins.android.library)
    alias(libs.plugins.kotlin.android)
    id("maven-publish")
    id("signing")
    id("tech.yanand.maven-central-publish") version ("1.3.0")
}

android {
    namespace = "cc.fastcv.line_number_clock"
    compileSdk = 34

    defaultConfig {
        minSdk = 24

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles("consumer-rules.pro")
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }
    kotlinOptions {
        jvmTarget = "11"
    }
}

dependencies {

    implementation(libs.androidx.core.ktx)
    implementation(libs.androidx.appcompat)
    implementation(libs.material)
    testImplementation(libs.junit)
    androidTestImplementation(libs.androidx.junit)
    androidTestImplementation(libs.androidx.espresso.core)
}

publishing {
    publications {
        create<MavenPublication>("mavenJava") {
            afterEvaluate { artifact(tasks.getByName("bundleReleaseAar")) }
            groupId = "你的Namespace"
            artifactId = "庫名稱"
            version = "庫版本"

            pom {
                name = "庫的名稱"
                description = "對庫的描述"
                url = "https://github.com/fastcv-cc/LineNumberClock"
                // 許可證名稱和地址
                licenses {
                    license {
                        name = "The Apache License, Version 2.0"
                        url = "http://www.apache.org/licenses/LICENSE-2.0.txt"
                    }
                }
                // 開發(fā)者信息
                developers {
                    developer {
                        name = "pisto"
                        email = "sayhigerry@gmail.com"
                    }
                }
                // 版本控制倉庫地址
                scm {
                    url = "https://github.com/fastcv-cc/LineNumberClock"
                    connection = "scm:git:git://github.com/fastcv-cc/LineNumberClock.git"
                    developerConnection =
                        "scm:git:ssh://git@github.com:fastcv-cc/LineNumberClock.git"
                }
            }

        }
    }

    repositories {
    }
}


signing {
    sign(publishing.publications)
}

mavenCentral {
    authToken = rootProject.properties["authTokenValue"] as String
    // 上傳是否應(yīng)該自動發(fā)布。如果您希望手動執(zhí)行此操作,請使用 'USER_MANAGED'。
    // 該屬性是可選的,默認為 'AUTOMATIC'。
    publishingType = "AUTOMATIC"
    // 當(dāng)發(fā)布類型為 'AUTOMATIC' 時,狀態(tài)API獲取 'PUBLISHING' 或 'PUBLISHED' 狀態(tài)的最大等待時間
    // 或者當(dāng)發(fā)布類型為 'USER_MANAGED' 時,獲取 'VALIDATED' 狀態(tài)。
    // 該屬性是可選的,默認為60秒。
    maxWait = 60
}

最后在我們的項目根目錄gradle.properties 文件中添加

signing.keyId=xxx
signing.password=xxx
signing.secretKeyRingFile=xxx
authTokenValue=xxx

這步配置完成之后,我們就可以使用以下命令將我們的庫文件上傳到Central Portal了。

./gradlew publishToMavenCentralPortal 

你問我這些信息從哪里獲???

不要急,我們接下來講怎么獲取這些配置信息

獲取signing的相關(guān)配置信息

由于Central Portal會對我們上傳的包進行簽名驗證。這里使用的簽名采用的是公私鑰(RSA)的模式,即私鑰簽名,公鑰驗證。所以我們需要先為項目生成一份公私鑰對,并將公鑰上傳至公鑰中心,再把私鑰配置到項目中,為生成的包簽名。

而GPG就是干這個活的,我的電腦是Mac,所以我以下記錄的是Mac上關(guān)于GPG的操作過程。其它系統(tǒng)的大家到網(wǎng)上搜一下就行了,教程很多。

安裝GPG

brew install gpg 

使用 GPG,生成公鑰和私鑰

在終端下執(zhí)行命令

gpg --full-generate-key

輸入命令后,一路選擇默認到輸入名字和郵箱的地方(回車就是選擇默認的),輸入你的名字和郵箱,中間有一次確認是否保存的選項,選擇y即可。

在輸入完名字和郵箱后,會有個新的選項出現(xiàn),詢問你是否需要修改信息,我們直接選擇Okey(輸入O)即可。接下來就是輸入你的密碼,然后確定就行。

整體大致如下:

千萬要記住你的密碼和相關(guān)信息哦?。?!

查看密鑰信息

gpg -k

可以看到剛才生成的密鑰。

其中 183****BD5 為密鑰指紋,指紋的后 8 位 「*****BD5」就是我們需要配置的 signing.keyId 的值。

你設(shè)置的密碼就是 signing.password 的值。

導(dǎo)出私鑰

gpg --export-secret-keys [密鑰指紋] > private-key.gpg

使用以上命令導(dǎo)出我們的私鑰。注意看我們這個命令執(zhí)行的目錄,生成的密鑰就在這個目錄。

然后我們將密鑰放置在某個目錄下,這個目錄的路徑就是 signing.secretKeyRingFile 的值。

上傳公鑰到公鑰服務(wù)器

我們在前面說過,Central Portal會對我們上傳的包進行簽名驗證,我們本地配置了私鑰進行簽名,但是我們的公鑰Central Portal不知道,所以它會去公鑰服務(wù)器里面根據(jù)我們的配置信息去找對應(yīng)的公鑰,然后做校驗。

所以我們需要把我們的公鑰上傳到公鑰服務(wù)器里面。

gpg --keyserver keyserver.ubuntu.com --send-keys [密鑰指紋]

其中,keyserver.ubuntu.com 就是公鑰服務(wù)器的地址,Central Portal校驗簽名就是從公鑰服務(wù)器拉取。

目前支持的公鑰服務(wù)器地址有三個:

  • pool.sks-keyservers.net
  • keyserver.ubuntu.com
  • keys.gnupg.net

如果一個地址訪問失敗,替換成換成其中任意一個都是可以的。

獲取authTokenValue值

獲取這個值我們需要回到我們的這個網(wǎng)站

https://central.sonatype.com/

選擇View Account。

在彈窗里面復(fù)制它給我們的賬號密碼,然后找個Base64轉(zhuǎn)碼網(wǎng)站以

**username:password **的格式轉(zhuǎn)碼,獲取到的Base64的編碼就是我們需要的authTokenValue的值。

完成這一步之后,我們就可以通過命令去上傳我們編碼好的庫文件了。

查看上傳的庫文件

https://central.sonatype.com/ 里面點擊這個

就可以看到你上傳的庫文件了,正常情況下,你的狀態(tài)是推送中的狀態(tài),等待一段時間后就可以了。

如果使用自己的庫文件

通過搜索自己庫文件的名字。

點擊進入,就可以看到相應(yīng)的配置信息了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容