Android发布aar到Maven central

1,872 阅读2分钟

虽然有不少文章介绍这个主题,但是,有很多人留言在Mac OS怎么使用GPG;上传脚本难配置。这篇文章就将解决这些问题。

文章还是会按照整体流程来叙述,但侧重点会在Mac OS使用GPG、脚本模板化两个方面。

申请GroupId使用权

  1. issues.sonatype.org注册账号

    创建Issue,类型选Project

截屏2021-09-17 18.26.39
  1. 填写资料
截屏2021-09-17 18.25.54

Group Id的值有两种:

  • 个人有可公开访问的域名,填写个人域名
  • 有github,填写io.github.username(username为用户名)
  1. 留意回复,并按指示操作

更详细操作参考

GPG生成密钥

命令均在Mac OS下操作

  1. 安装gnupg

    brew install gnupg
    
  1. 生成密钥对

    gpg --full-gen-key
    
    截屏2021-09-18 11.03.23

    密钥类型可以根据需要选择;密钥有效期,为了方便建议选永不过期。

  2. 上传公钥

    私钥是绝不能泄漏的,公钥是别人用来验证是否是用你的私钥签名。所以,公钥需要上传到公钥服务器。

    gpg --keyserver keyserver.ubuntu.com --send-keys B5C2D2AF
    

    --keyserver:指定公钥服务器

    --send-keys:可指定密钥ID

    由于国内科学上网,有些服务器可能无法访问,提供两个其他的选择:

    • keys.openpgp.org
    • pgp.mit.edu
  3. 导出密钥

    为了更方便的使用密钥,比如CI,将密钥导出。

    gpg --export-secret-keys B5C2D2AF > B5C2D2AF.gpg
    

    --export-secret-keys:可指定密钥ID

上传脚本

  1. 在需要上传module根目录创建scripts目录
  2. 在创建的scripts目录下创建publish.gradle文件
  3. 复制上传脚本
project.plugins.apply('maven-publish')
project.plugins.apply('signing')
​
def localProps=new Properties()
localProps.load(project.file('local.properties').newDataInputStream())
Enumeration enumeration = localProps.keys();
while (enumeration.hasMoreElements()) {
    def key = enumeration.nextElement();
    def value = localProps.get(key);
    project.properties[key]=value
}
​
afterEvaluate {
    publishing {
        publications {
            release(MavenPublication) {
                groupId = 'io.github.wslaimin'
                artifactId = 'RVAdapter'
                version = '1.0.0'
​
                from components.release
                // generate pom.xml
                pom {
                    name = 'RVAdapter'
                    description = 'Simply defining adapters of RecyclerView in Android'
                    url = 'https://github.com/wslaimin/RVAdapter.git'
​
                    licenses {
                        license {
                            name = 'The Apache License, Version 2.0'
                            url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                        }
                    }
                    developers {
                        developer {
                            id = 'wslaimin'
                            name = 'TFly'
                            email = 'wslaimin@gmail.com'
                        }
                    }
                    scm {
                        url = 'https://github.com/wslaimin/RVAdapter.git'
                    }
                }
            }
        }
​
        repositories {
            maven {
                // change to point to your repo
                def releaseRepo = 'https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/'
                def snapshotRepo = 'https://s01.oss.sonatype.org/content/repositories/snapshots/'
​
                url = publishing.publications.release.version.endsWith('SNAPSHOT') ? snapshotRepo : releaseRepo
                credentials {
                    username = project.properties['credencial.username']
                    password = project.properties['credencial.password']
                }
            }
            maven {
                name 'Build'
                url = layout.buildDirectory.dir('repo')
            }
        }
    }
​
    if(project.properties['signing.keyId']&&project.properties['signing.password']&&project.properties['signing.secretKeyRingFile']){
        signing {
            sign publishing.publications.release
        }
    }
}
  1. 在需要上传module根目录下的local.properties(如果没有新建个)加入口令

    credencial.username=
    credencial.password=
    ​
    signing.keyId=
    signing.password=
    signing.secretKeyRingFile=
    

    credencial.username:Sonatype账号

    credencial.password:Sonatype密码

    signing.keyId:生成的密钥ID

    signing.password:密钥密码

    signing.secretKeyRingFile:导出密钥文件位置

  1. 在需要上传module的build.gradle引用上传脚本

    apply from: './scripts/publish.gradle'
    

以上步骤完成后,同步项目后,能够看到publish相关任务:

截屏2021-09-18 14.00.17

publishReleasePublicationToBuildRepository:部署到项目的build目录下

publishReleasePublicationToMavenLocal:部署到本地maven仓库

publishReleasePublicationToMavenRepository:部署到远程maven仓库

脚本和口令配置参照这个项目

脚本模板化

每个新项目都写一遍脚本,配置口令,显然是不便的。所以,可以将脚本模板化来简化配置过程。

打开Android Studio的Live Templates配置。

  1. 创建上传脚本模板
截屏2021-09-18 16.34.03

创建好模板后,在创建好的publish.gradle输入pub就能快速引入上传脚本。

  1. 创建口令模板

    方法同上,文件类型选择Other。

发布

执行publishReleasePublicationToMavenRepository任务后,只是staging状态,需要在Sonatype后台操作发布。

操作参考

以上就是所有内容了,enjoy it!