当前位置:   article > 正文

安卓应用移植鸿蒙(五):发布鸿蒙自定义组件(har包)到MavenCenter全过程,采坑无数_har 包

har 包

这里首先吐槽一下,MavenCenter真心发布太难用,而华为官方的教程更是半吊子,如果第一次使用Maven发布的同学,基本不可能顺利发布,笔者前后消耗近2周时间。

希望这个文章能给想发布鸿蒙自定义组件的同学带来一点帮助,少走坑和弯路,心愿足矣

目录

1.资料

1.1排雷

1.2选择

2.上传前步骤

2.1.注册账号

2.2 安装GPG

2.3.新建开源代码

3.上传

4.操作Nexus

注意坑来了,在点击release的时候,一定更要选中har包,不然会发布成.module后缀的发布包,这也是2.2.1版本无奈产生的原因。

6.最后一步,关闭Jira的Issue

 7.总结


1.资料

互联网的资料多如横河沙数,你可以搜到很多资料,但是大部分没用,还可能误导你。

1.1排雷

1)如果你没有用过MavenCenter去发布,一定会去找资料,那么找到的一般都是Java发布到MavenCenter,Android发布到MavenCenter,前者是jar包,后者是aar包,而鸿蒙是har包,所以基本上不能通用。

2)那么一定会想,为什么JitPack发布,那个不是很简单,直到你搜到这篇文章:如何把自己的module(第三方库)发布到jitpack,它会让你死心,目前来说,Android发布过去很简单,但是鸿蒙,因为一些系统库并没有的关系,无法在上面发布。

3)发布到华为自己的仓库呢,百度了很久,注册了华为云,结果发现,它是一个类似于Github和Gitee一样的平台,并非像Jitpack和MavenCenter一样的托管平台。(后来发现其实是有的,叫HAPM,但是百度照死搜不到)。

1.2选择

感谢华为的开发者联盟,让我搜到了两篇很不错的文章,终于能够踏出第一步,之前用百度搜,根本连发布的门都进不去:

1)华为官方写的文章

HarmonyOS开源三方组件Maven&HAPM发布流程指导https://developer.huawei.com/consumer/cn/forum/topic/0202621903943050069?fid=0101303901040230869https://developer.huawei.com/consumer/cn/forum/topic/0202621903943050069?fid=0101303901040230869读完这篇文章,我才发现是有HAPM这个华为自己的托管平台的,但是因为我选择了MavenCenter,所以后面的没选择用HAPM,还要装Node.js等一类软件才行。

这篇文章有两个问题:

1.直接发布到Release,而不是走Nexus的staging->close->release的步骤,不知道会有什么风险(这个我没验证,只是参照了步骤,因为他们用到signing组件,我觉得可能过不去gpg校验)。

2.只讲到了发布到Nenus的步骤,即只说了90%的步骤,还差10%,你不知道怎么走?

2)LV6的楼主写的文章

造轮子教程:把鸿蒙库(har)开源到中央仓库(maven)的gradle配置https://developer.huawei.com/consumer/cn/forum/topic/0202595700752730458?fid=0101587866109870106https://developer.huawei.com/consumer/cn/forum/topic/0202595700752730458?fid=0101587866109870106这篇文章,只说70%的步骤,不过比较好的是,它前70%的步骤写的都比较详细,你能够比较容易的走完,然后30%就走不下去了。

以上两篇文章都默认你是发布过MavenCenter的经验的,对入门初学者并不友好,不过笔者能够顺利提交到MavenCenter,也是基于这两篇文章的融合。感谢以上两位作者!

2.上传前步骤

2.1.注册账号

首先需要有maven(oss)账号:Java开发|Maven中央仓库注册以及发布Java项目 - 墨天轮,这篇文章把注册步骤写的很详细了,可以完全照搬,就是要注意一点,GroupID不能随便写,这点它没有详细说,所以笔者这里展开说下:

 这个红色圈出来的就是GroupID,如果你是托管在Gitee上或者Github上,需要遵守一个命名规则:

如果你是自己的网站,你需要在自己的网页写个重定向,可以让你的GroupID直接重定向到你的主页,他们的目的很简单,证明这个主页是你的!其它步骤按照文章中所说即可。

2.2 安装GPG

 安装并配置 GPG(发布到 Maven 仓库中的所有文件都要使用 GPG 签名,以保障完整性):Java开发|Maven中央仓库注册以及发布Java项目 - 墨天轮,还是这篇文章,基本参考就可以,这里也补充一点吧,它没说到,我采坑到了

GPG秘钥传服务器的时候,Maven验证是有三个地址的,它这里只说了一个,可能因为一些原因,这些服务器会暂时关停,所以发布不了你的指纹到公网上,三个地址的发布命令:

gpg --keyserver hkp://pgp.mit.edu:11371 --send-keys xxx(你的指纹)
gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys xxx(你的指纹)
gpg --keyserver hkp://pool.sks-keyservers.net:11371 --send-keys xxx(你的指纹)

第二个就是它文章里推荐的GPG服务器,这个如果你发布成功了,就不需要再发布另外两个了,Maven是三个轮询的。

它的步骤应该是这样的,你要发布一个组件,为了完整性和篡改,你要同步把公钥上传上来,Maven拿着公钥去上面三个服务器去验证信息,如果验证成功了,就证明是你,否则验证失败了,你就发布不了。

然后文章看到安装GPG,就够了,第四步就不要看了,因为那已经是Java的东西了,和鸿蒙没关系了再看你也看不懂了。

图中这步骤,就不要看了。

2.3.新建开源代码

新建需要开源的项目,结构参考:

ViewModel_for_ohoshttps://gitee.com/ethan-osc_admin/viewmodel_for_ohos/tree/exam%2Fmaven/https://gitee.com/ethan-osc_admin/viewmodel_for_ohos/tree/exam%2Fmaven/大概思路是这样的:

1)写一个专门的upload.gradle文件,作为上传脚本(上传后,mavencenter自动帮你打包),这里配置了要发布组件的基本信息,远程仓库地址以及你的远程仓库的用户名和密码

  1. apply plugin: 'maven-publish'
  2. apply plugin: 'maven'
  3. apply plugin: 'signing'
  4. def DEFAULT_POM_NAME = 'ohos_viewmodel_livedata'
  5. def DEFAULT_POM_VERSION = '2.2.1' //har包版本信息
  6. def DEFAULT_POM_ARTIFACT_ID = "ohos_viewmodel_livedata" //har包ID
  7. def DEFAULT_POM_GROUP_ID = 'io.gitee.ethan-osc_admin' //项目组ID
  8. def DEFAULT_POM_PACKAGING = 'har' //包类型,固定为har
  9. def DEFAULT_POM_DESCRIPTION = 'viewmodel and livedata for harmonyos'
  10. def MAVEN_USERNAME = 'xxxx' //你自己的远程Maven仓的用户名
  11. def MAVEN_PASSWORD = 'xxxx' //你自己的远程Maven仓的密码
  12. def REMOTE_MAVEN_REPOSITORY_URL = 'https://s01.oss.sonatype.org/service/local/staging/deploy/maven2' //远程Maven仓地址
  13. //申请maven中央仓库参考:https://www.modb.pro/db/54557
  14. //仓库配置参考:https://central.sonatype.org/publish/publish-gradle/
  15. //上传成功后:https://s01.oss.sonatype.org/#stagingRepositories
  16. publishing {
  17. publications {
  18. maven(MavenPublication) {
  19. group = DEFAULT_POM_GROUP_ID
  20. artifactId = DEFAULT_POM_ARTIFACT_ID
  21. version = DEFAULT_POM_VERSION
  22. pom {
  23. group = DEFAULT_POM_GROUP_ID
  24. artifactId = DEFAULT_POM_ARTIFACT_ID
  25. version = DEFAULT_POM_VERSION
  26. url = REMOTE_MAVEN_REPOSITORY_URL
  27. name = DEFAULT_POM_NAME
  28. description = DEFAULT_POM_DESCRIPTION
  29. packaging = DEFAULT_POM_PACKAGING
  30. licenses {
  31. license {
  32. name = 'The Apache License, Version 2.0'
  33. url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
  34. }
  35. }
  36. developers {
  37. developer {
  38. id = 'iogiteeethan-osc_admin'
  39. name = 'ethenwei'
  40. email = 'ethenwei@qq.com'
  41. }
  42. }
  43. scm {
  44. connection = 'scm:svn:http://foo.googlecode.com/svn/trunk/'
  45. developerConnection = 'scm:svn:https://foo.googlecode.com/svn/trunk/'
  46. url = 'http://foo.googlecode.com/svn/trunk/'
  47. }
  48. }
  49. }
  50. }
  51. repositories {
  52. maven {
  53. // url = LOCAL_MAVEN_REPOSITORY_URL //发布到本地Maven仓
  54. //发布到远程Maven仓的地址以及Maven仓的帐号和密码
  55. url = REMOTE_MAVEN_REPOSITORY_URL
  56. credentials {
  57. username MAVEN_USERNAME
  58. password MAVEN_PASSWORD
  59. }
  60. }
  61. }
  62. }
  63. signing {//秘钥配置请看:gradle.properties
  64. sign publishing.publications.maven
  65. }
  66. afterEvaluate { project ->
  67. DEFAULT_POM_ARTIFACT_ID = project.name
  68. publishing {
  69. publications {
  70. maven(MavenPublication) {
  71. from components.release //指定发布的har包类型为debug或release
  72. group = DEFAULT_POM_GROUP_ID
  73. artifactId = DEFAULT_POM_ARTIFACT_ID
  74. version = DEFAULT_POM_VERSION
  75. pom {
  76. name = DEFAULT_POM_NAME
  77. description = DEFAULT_POM_DESCRIPTION
  78. packaging = DEFAULT_POM_PACKAGING
  79. }
  80. }
  81. }
  82. }
  83. }

 这个模板文件,基本改下def里面的信息和开发者的信息,就可以直接用

注意:区分上传的是har包还是jar包,需要对应修改upload.gradle文件中from 属性,发布har包使用字段components.release,发布jar包使用components.java

1.png

2)要上传哪个组件,就在那个组件的build.gradle里面apply from这个upload.gradle文件

  1. apply plugin: 'com.huawei.ohos.library'
  2. //For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510
  3. // 上传完Maven之后需要删除该行代码,否则工程编译会报错
  4. // 有了这一行,才会出现publish的按钮
  5. apply from: '../upload.gradle'
  6. ohos {
  7. compileSdkVersion 5
  8. defaultConfig {
  9. compatibleSdkVersion 5
  10. }
  11. buildTypes {
  12. release {
  13. proguardOpt {
  14. proguardEnabled false
  15. rulesFiles 'proguard-rules.pro'
  16. }
  17. }
  18. }
  19. }
  20. dependencies {
  21. implementation fileTree(dir: 'libs', include: ['*.jar'])
  22. testImplementation 'junit:junit:4.13'
  23. }

3)修改gradle.properties,配置GPG证书的指纹id和提取密码,远程仓库的账号和密码

  1. #gpg文件和密钥对
  2. #导出secretKeyRingFile的命令:gpg --export-secret-keys -o secring.gpg
  3. #使用短keyId的命令:gpg --list-keys --keyid-format short
  4. signing.keyId=指纹后8位
  5. signing.password=生成指纹的时候设置的密码
  6. signing.secretKeyRingFile=../../../secring.gpg(该副本文件的本地地址)
  7. #https://s01.oss.sonatype.org/ 账号和密码
  8. ossrhUsername=xxxx
  9. ossrhPassword=xxxx

到这一步,70%的工作算是完成了,也就是笔者说的第二篇文章的内容就结束了,后面没说怎么搞。

3.上传

 只有Gradle里面写了apply for upload.gradle,点击之后,就可以上传了,一般上传可能出错,就是配置里面的gpg的keyid,密码,maven的用户名和密码写错了,这点特别注意然后,你就可以在Nexus Manager里面看到你提交的了。

4.操作Nexus

//上传成功后:https://s01.oss.sonatype.org/#stagingRepositories

 访问这个地址,可以看到你上传的

笔者一开始的版本是2.2.0,尝试了几次,一直报错,所以留着了,把版本改成2.2.1发布了,2.2.0留着提醒自己错误的原因。

如果上传成功后,可以在这个页面一次点击1234,3就是说关闭这次Issue,4就是把它发布,放到release目录下去,当然如果过程中出错,可以在Activity的Tab下看到错误信息,笔者的错误是因为输入错了gpg密码造成的,导致签名过不去,所以无法close,无法release。

这个步骤在第一篇文章,华为的官方教程中是没有的,也就是最后的10%没告诉你怎么操作。

发布后,可以在Nexus中搜到你的包。

注意坑来了,在点击release的时候,一定更要选中har包,不然会发布成.module后缀的发布包,这也是2.2.1版本无奈产生的原因。

6.最后一步,关闭Jira的Issue

 很多人没有走这一步,所以一直都无法正常发布,当你的一切都弄完了,并不是就自动会给你同步到MavenCenter,如果这么想,那你真是太天真了,需要像我们正常解bug一样,关闭jira的issue:

在Comment里面写上:I have already completed the first release.以及发布包的地址,管理员会去验证,然后帮你同步到MavenCenter。

 7.总结

 至此,整个发布才算真正完成,这个过程还是比较慢的,而且很繁琐,加上没有完整的入门教程,对一般人不友好,门槛也喊高。期待Jitpack能早点支持,华为可以出一个类似于Jitpack一样的平台,方便快捷的让开发者发布

8.二次提交

笔者移植完ViewModel后,又移植了LiveData,然后依旧重新建立一个 Issue,想着再走一次流程,然而却不用像第一次那么麻烦了,得到了如下对话

他的意思是,不需要再创建Issue了,也不需要在原来的Issue下再评论了,只要你提交到Nexus后,就会自动帮你同步,我验证了下,提交了一个新的库,果然只要把版本号改下,就拉了下来刚提交的库,所以说,maven第一次确实很麻烦,不过后面就非常简单了,只要提交后在Nexus下自己发布就行,因为你已经有了所有权限

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/98277
推荐阅读
相关标签
  

闽ICP备14008679号