使用MavenCentral发布Kotlin多平台库的远程依赖(KMM,KMP)

news2024/11/14 20:42:25

前言

开发者可能都会做自己的开源库,像我以前只做一些单平台的,如Android或JVM平台,这时候直接使用jitpack即可,很简单就能发布远程依赖

jitpack参考:

发布开源库的踩坑经历:jitpack.io_李小白lt的博客

而现在Kotlin可以通过expect来实现原生多平台项目(或库),这时我们开发出来一个多平台的库,可以使用MavenCentral来发布

expect参考:

KMM Kotlin expect的几种声明方式_李小白lt的博客

正文

接下来我们来看一下如何发布Kotlin多平台库

1.首先可以创建一个多平台的库,可以参考:

KMM+Compose 开发一个Kotlin多平台应用_kotlin kmm_李小白lt的博客

Create and publish a multiplatform library – tutorial | Kotlin Documentation (kotlinlang.org)

2.注册Sonatype Jira帐户(如果是第一次操作从这一步开始,否则,请从第11步开始看)

Sign up for Jira - Sonatype JIRA

进入上面的链接,然后填入信息注册,注册完成后续需要使用Username和Password

3.创建问题(没错!)

注册成功后,一般会跳到这个页面,可以点这个位置创建一个问题

然后这样填:

4.验证Group Id归属

上面的问题提交完之后,会有机器人回复你的消息,如下:

它让你创建一个名字是他发的 OSSRH-XXX的public的Github的仓库

你用你的Github创建完成后,在这里将状态改为打开,一般是下拉后的第一行(我这里做过了) 

 设置完状态后,一会就会看见机器人的留言

5.生成密钥

接下来需要使用GPG来生成密钥

windows可以使用以下链接下载安装,其他系统自己找找吧:

Gpg4win - Secure email and file encryption with GnuPG for Windows

安装就一路下一步吧

然后打开cmd命令行,输入:

gpg --full-gen-key

然后他会让你输入各种信息(中间提示y/n就输入y):

密钥种类 RSA 

密钥大小 4096

过期时间 0   (表示永不过期)

姓名

邮箱 (后续使用)

评论 可以不填

 密码 (后续使用)

6.获取密钥信息

输入命令验证上述步骤是否成功:

gpg --list-keys

得到这样的信息就成功了

红框选中的(密钥ID)后八位后续需要使用,也就是密钥的指纹

 然后上传你的公钥到服务器

gpg --keyserver keyserver.ubuntu.com --send-keys <你的密钥指纹>

 然后通过以下命令保存私钥到本地,后续需要使用

gpg --export-secret-keys -o <保存的文件地址>

一般文件名使用 secring.gpg

ps:linux或macos可能需要使用下面这个命令(我的windows上反正是用不了)

gpg --export-secret-keys <密钥指纹> | base64

7.配置Gradle预编译脚本插件

先在你的项目中创建一个model,取名为 convention-plugins

然后创建目录如下所示,可以参考我的项目配置(ComposeViews):

ps:需要注意目录位置

model里的build.gradle.kts中写如下代码:

plugins {
    `kotlin-dsl` // Is needed to turn our build logic written in Kotlin into the Gradle Plugin
}

repositories {
    gradlePluginPortal() // To use 'maven-publish' and 'signing' plugins in our own plugin
}

文件convention.publication.gradle.kts中写如下代码:

import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.tasks.bundling.Jar
import org.gradle.kotlin.dsl.`maven-publish`
import org.gradle.kotlin.dsl.signing
import java.util.*

plugins {
    `maven-publish`
    signing
}

// Stub secrets to let the project sync and build without the publication values set up
ext["signing.keyId"] = null
ext["signing.password"] = null
ext["signing.secretKeyRingFile"] = null
ext["ossrhUsername"] = null
ext["ossrhPassword"] = null

// Grabbing secrets from local.properties file or from environment variables, which could be used on CI
val secretPropsFile = project.rootProject.file("local.properties")
if (secretPropsFile.exists()) {
    secretPropsFile.reader().use {
        Properties().apply {
            load(it)
        }
    }.onEach { (name, value) ->
        ext[name.toString()] = value
    }
} else {
    ext["signing.keyId"] = System.getenv("SIGNING_KEY_ID")
    ext["signing.password"] = System.getenv("SIGNING_PASSWORD")
    ext["signing.secretKeyRingFile"] = System.getenv("SIGNING_SECRET_KEY_RING_FILE")
    ext["ossrhUsername"] = System.getenv("OSSRH_USERNAME")
    ext["ossrhPassword"] = System.getenv("OSSRH_PASSWORD")
}

val javadocJar by tasks.registering(Jar::class) {
    archiveClassifier.set("javadoc")
}

fun getExtraString(name: String) = ext[name]?.toString()

publishing {
    // Configure maven central repository
    repositories {
        maven {
            name = "sonatype"
            setUrl("https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/")
            credentials {
                username = getExtraString("ossrhUsername")
                password = getExtraString("ossrhPassword")
            }
        }
    }

    // Configure all publications
    publications.withType<MavenPublication> {
        // Stub javadoc.jar artifact
        artifact(javadocJar.get())

        // Provide artifacts information requited by Maven Central
        pom {
            name.set("<你的项目名>")
            description.set("<你的项目描述>")
            url.set("<你的项目地址>")

            licenses {
                license {
                    name.set("<开源协议,比如 Apache License 2.0>")
                    url.set("<开源协议地址,比如 http://www.apache.org/licenses/>")
                }
            }
            developers {
                developer {
                    id.set("<你的Github名字>")
                    name.set("<你的Github昵称>")
                    email.set("<你的Github邮箱>")
                }
            }
            scm {
                url.set("<你的项目地址>")
            }
        }
    }
}

// Signing artifacts. Signing.* extra properties values will be used
signing {
    sign(publishing.publications)
}

8.配置参数

将私钥文件secring.gpg复制到项目根目录

在项目根目录的local.properties文件中加入如下配置:

signing.keyId=<密钥指纹>
signing.password=<密钥密码>
signing.secretKeyRingFile=../secring.gpg
ossrhUsername=<Sonatype Jira的Username>
ossrhPassword=<Sonatype Jira的Password>

然后在.gitignore文件中将这两个文件配置为不上传

secring.gpg
local.properties

9.使用Gradle预编译脚本插件

在项目根目录的settings.gradle.kts文件中配置:

rootProject.name = "<你的项目名>"
includeBuild("convention-plugins")

在你需要发布的model中的build.gradle.kts中配置:

plugins {
    //kotlin("multiplatform") version xxx
    ...
    
    id("convention.publication")
}

然后同步一下gradle

ps:你要发布的model的model名字,后面就会变成你的远程依赖的项目名,比如:我的model:

本来红框选中的model名字叫croe,结果他给我生成的依赖地址为这个: io.github.ltttttttttttt:core:xxx

10.发布目标配置

在你需要发布的model中的build.gradle.kts中,除了需要配置下面这个插件除外,还需要配置更多:

id("convention.publication")

配置你的group id和版本号:

group = "io.github.<你的Github名字>"
version = "<版本号>"

配置你Kotlin多平台的target

kotlin {
    //发布android target
    android {
        //发布安卓需要额外配置这两个变体
        publishLibraryVariants("debug", "release")
        ...
    }
    //发布jvm的desktop的target
    jvm("desktop") {
        ...
    }
    //发布js target
    js(...){
        ...
    }
}

截图如下:

11.上传项目产物至远程服务器

先调试不报错后,在Terminal tab中使用以下命令上传(第一次传最好是先clear一下)

ps:如果报错请修改你的错误后再重试

./gradlew publishAllPublicationsToSonatypeRepository

这样就成功了

12.去后台将远程服务器上的库确认发布

访问以下网址,使用Sonatype Jira账号进行登录:

ps:这个后台巨慢,巨卡,佛了

Nexus Repository Manager (sonatype.org)

点击Staging Repositories

点击Refresh

 经过漫长的加载和重试中,出来了结果,我们选中,然后在点击close,直接确定就行

成功后(或者刷新几次看看)之后,我们在选中,然后在点击release,直接确定就行

成功后这个后台就完事了

然后在半个小时内可以发布到maven远程服务器上,4个小时左右可以在maven搜索中找到

maven服务器地址: Central Repository: (maven.org)

ps:链接后面可以拼上 io/github/<你的github名字>/<你的model名> 来直接访问对应项目地址

maven搜索地址: Maven Central (sonatype.com)

13.如果你这个库是第一次提交,则需要通知机器人,让他给你"开库"

打开之前注册的网站:

System Dashboard - Sonatype JIRA

在你创建的问题中,回复一下"I released the first component"

 等机器人给你回复后,你的库就可以使用了,使用方式:

implementation("io.github.<你的github名字>:<开源库上传的model的名字>:<版本号>")
//比如: implementation("io.github.ltttttttttttt:ComposeViews:1.3.7.4")

结语

可以发现配置过程又臭又长,各种参考文档上也有错误,这个后台更是难用中的难用,佛了

可以参考我的项目的配置:

ltttttttttttt/ComposeViews

除了第一次配置之后,后续都只需要第11,12步即可完成配置

参考:

Create and publish a multiplatform library – tutorial | Kotlin Documentation (kotlinlang.org)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/372819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机三级网络技术】 第二篇 中小型系统总体规划与设计

文章目录一、基于网络的信息系统基本结构二、划分网络系统组建工程阶段三、网络需求调研与系统设计原则四、网络用户调查与网络工程需求分析1.网络用户调查2.网络节点的地理位置分布3.应用概要分析4.网络需求详细分析五、网络总体设计基本方法1.网络工程建设总体目标与设计原则…

C++---线性dp---传纸条(每日一道算法2023.2.26)

注意事项&#xff1a; 本题dp思路与 “线性dp–方格取数” 一致&#xff0c;下方思路仅证明为什么使用方格取数的思路是正确的。 题目&#xff1a; 小渊和小轩是好朋友也是同班同学&#xff0c;他们在一起总有谈不完的话题。 一次素质拓展活动中&#xff0c;班上同学安排坐成…

3.7寸按键翻页工牌

产品参数 产品型号 ESL_BWR3.7_BLE 产品尺寸 (mm) 62.51066.5 显示技术 E ink 显示区域 (mm) 47.32(H)81.12(V) 分辨率 (像素) 280480 像素尺寸(mm) 0.1690.169 150dpi 显示颜色 黑/白 视觉角度 180 工作温度 0℃ - 50℃ 电池 500mAh ( Type-C 充电…

黑盒测试用例设计方法-等价类划分法

目录 一、等价类的作用 二、等价类的分类 三、等价类的方法 四、等价类的原则 五、按照测试用例的完整性划分等价类 六、等价类步骤 七、案例 一、等价类的作用 为穷举测试设计测试点。 穷举&#xff1a;列出所有的可能情况&#xff0c;对其一一判断。 测试点&#x…

JasperReports studio相关操作

1.2 JasperReports JasperReports是一个强大、灵活的报表生成工具&#xff0c;能够展示丰富的页面内容&#xff0c;并将之转换成PDF&#xff0c;HTML&#xff0c;或者XML格式。该库完全由Java写成&#xff0c;可以用于在各种Java应用程序&#xff0c;包括J2EE&#xff0c;Web应…

【数据挖掘】1、综述:背景、数据的特征、数据挖掘的六大应用方向、有趣的案例

目录一、背景1.1 学习资料1.2 数据的特征1.3 数据挖掘的应用案例1.4 获取数据集1.5 数据挖掘的定义二、分类三、聚类四、关联分析五、回归六、可视化七、数据预处理八、有趣的案例8.1 隐私保护8.2 云计算的弹性资源8.3 并行计算九、总结一、背景 1.1 学习资料 推荐书籍如下&a…

C语言刷题(3)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容还是做几道题噢&#xff0c;好好复习一下之前的知识点&#xff0c;现在&#xff0c;就让我们开始复习吧 牛客网在线编程_编程学习|练习题_数据结构|系统设计题库 倒置字符串_牛客题霸_牛客网 BC40 竞选社长 BC41 你是天才…

vitepress 就这几步操作,博客就搭好啦?

Ⅰ、什么是vitepress &#x1f48e; vitepress 使用场景 简单的说 &#xff0c;只要 会用 markdown 语法&#xff0c;就能构建自己的 「博客、笔记、使用文档」等系统 &#xff1b; ✨ vitepress 优势 优势介绍傻瓜式操作只需要配置 菜单 和 对应的 markdown 就能实现博客、笔…

OKR 与 KPI有何异同?各部门OKR实例【小bu】

OKR 与 KPI&#xff0c;如何本土化是关键 近期公司计划对去年实施的绩效考核方案进行优化&#xff0c;公司以往采用 KPI 绩效考核方式&#xff0c;产生了一些争议。一方面&#xff0c;执行期间部分部门一度忽略指标设置的真实目的&#xff0c;导致出现短视思维和行为&#xff1…

Vision Transformer学习了什么-WHAT DO VISION TRANSFORMERS LEARN? A VISUAL EXPLORATION

WHAT DO VISION TRANSFORMERS LEARN? A VISUAL EXPLORATION 文章地址 代码地址 摘要 视觉转换器( Vision Transformers&#xff0c;ViTs )正在迅速成为计算机视觉的事实上的架构&#xff0c;但我们对它们为什么工作和学习什么知之甚少。虽然现有研究对卷积神经网络的机制进…

LabVIEW控制DO通道输出一个精确定时的数字波形

LabVIEW控制DO通道输出一个精确定时的数字波形如何使用数据采集板卡的DO通道输出一个精确定时的数字波形&#xff1f;解答:产生一个数字波形首先需要创建一个布尔数组&#xff0c;把波形序列信息放到该布尔数组中&#xff0c;然后通过一个布尔数组至数字转换vi来产生数字波形。…

【C++】仿函数、lambda表达式、包装器

1.仿函数 仿函数是什么&#xff1f;仿函数就是类中的成员函数&#xff0c;这个成员函数可以让对象模仿函数调用的行为。 函数调用的行为&#xff1a;函数名(函数参数)C中可以让类实现&#xff1a;函数名(函数参数)调用函数 自己写一个仿函数&#xff1a; 重载()运算符 cla…

chatgpt的原理 第四部分

五、ChatGPT 终于说到了主角&#xff0c;能看到这里的&#xff0c;可以关注一下 JioNLP 公众号吗&#xff1f;我写的也够累的。 ChatGPT 模型上基本上和之前 GPT-3 都没有太大变化&#xff0c;主要变化的是训练策略变了&#xff0c;用上了强化学习。 强化学习 几年前&#xf…

【Linux驱动开发100问】如何编译Linux内核?

&#x1f947;今日学习目标&#xff1a;如何编译Linux内核&#xff1f; &#x1f935;‍♂️ 创作者&#xff1a;JamesBin ⏰预计时间&#xff1a;10分钟 &#x1f389;个人主页&#xff1a;嵌入式悦翔园个人主页 &#x1f341;专栏介绍&#xff1a;Linux驱动开发100问 如何编译…

【论文笔记】Deep 3D-to-2D Watermarking == Google ==CVPR‘2022

Deep 3D-to-2D Watermarking: Embedding Messages in 3D Meshes and Extracting Them from 2D Renderings 本文工作&#xff1a;提出了一个端到端的框架来从2D渲染图像中提取水印信息&#xff0c;且对 不同光照和相机位姿 的渲染结果具有鲁棒性。 1.1 本文工作概述 核心贡献&…

metaRTC新增纯C版JSON支持

概述 JSON 是轻量级的文本数据交换格式&#xff0c;它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 metaRTC新版本新增了纯C版的JSON支…

操作系统权限提升(十五)之绕过UAC提权-基于白名单DLL劫持绕过UAC提权

系列文章 操作系统权限提升(十二)之绕过UAC提权-Windows UAC概述 操作系统权限提升(十三)之绕过UAC提权-MSF和CS绕过UAC提权 操作系统权限提升(十四)之绕过UAC提权-基于白名单AutoElevate绕过UAC提权 注&#xff1a;阅读本编文章前&#xff0c;请先阅读系列文章&#xff0c;以…

pytorch学习日记之图片的简单卷积、池化

导入图片并转化为张量 import torch import torch.nn as nn import matplotlib.pyplot as plt import numpy as np from PIL import Image mymi Image.open("pic/123.png") # 读取图像转化为灰度图片转化为numpy数组 myimgray np.array(mymi.convert("L"…

GNURadio RTL-SDR之FM接收

环境配置与准备&#xff1a; PC操作系统: Windows10 64位系统。RTL-SDR: 包括射频主板和天线。Radioconda&#xff1a;GNURadio windows方案之一&#xff0c;安装radioconda-2023.02.24-Windows-x86_64&#xff0c;官方下载和操作指导&#xff1a; InstallingGR - GNU Radioht…

spring框架--全面详解(学习笔记)

目录 1.Spring是什么 2.Spring 框架特点 3.Spring体系结构 4.Spring开发环境搭建 5.spring中IOC和DI 6.Spring中bean的生命周期 7.Spring Bean作用域 8.spring注解开发 9.Spring框架中AOP&#xff08;Aspect Oriented Programming&#xff09; 10.AOP 实现分类 11.A…