评论

收藏

[HarmonyOS] 鸿蒙开源三方组件Maven&HAPM发布流程指导

移动开发 移动开发 发布于:2021-07-16 15:44 | 阅读数:791 | 评论:0

1 组件Maven发布
这里以发布到maven中心仓( https://s01.oss.sonatype.org/content/repositories/releases/ ) 为示例

1.1 前提条件:
Maven账号注册:  获取maven中心仓的用户名和密码以及生成groupid

1.2 maven 发布模板
对应修改library级别的build.gradle 文件的rootProject属性:
apply plugin: 'com.huawei.ohos.library'
apply from: '../upload.gradle' // 上传完Maven之后需要删除该行代码,否则工程编译会报错

rootProject.ext{
  DEFAULT_GROUP_ID = '按照实际的GROUP_ID为准' // 请以申请maven注册时的groupid为准,这个属性不用改
  DEFAULT_ARTIFACT_ID = '按照实际的ARTIFACT_ID为准' // 建议填写组件的仓名,单个lib库的就直接仓名,多个lib库的就以仓名+各lib后缀
  DEFAULT_VERSION = 'VERSION_ID'// 在 https://s01.oss.sonatype.org/#/welcome 上查找对应组件的版本号
}

ohos {
  compileSdkVersion 5
  defaultConfig {
    compatibleSdkVersion 5
  }
  
}

dependencies {
  implementation fileTree(dir: 'libs', include: ['*.jar'])
  testCompile'junit:junit:4.12'
}
工程根目录创建一个upload.gradle文件,内容模板如下:
apply plugin: 'maven'
apply plugin: 'maven-publish'

def REMOTE_MAVEN_REPOSITORY_URL='https://s01.oss.sonatype.org/content/repositories/releases/' //远程Maven中心仓地址,固定的不需要改动
def MAVEN_USERNAME='按照实际的账号输入' // 远程Maven中心仓的用户名,固定的不需要改动
def MAVEN_PASSWORD='按照实际的密码输入' // 远程Maven中心仓的密码,固定的不需要改动

afterEvaluate { project ->
  publishing {
    publications{
      mavenJava(MavenPublication){
        // 发布har包使用字段components.release,发布jar包使用components.java
        from components.release
        group=rootProject.ext.DEFAULT_GROUP_ID
        artifactId=rootProject.ext.DEFAULT_ARTIFACT_ID
        version=rootProject.ext.DEFAULT_VERSION
      }
    }
    repositories{
      maven{
        url=REMOTE_MAVEN_REPOSITORY_URL
        credentials{
          username MAVEN_USERNAME
          password MAVEN_PASSWORD
        }
      }
    }
  }

}
1.2 maven 发布步骤
  • 在项目根目录粘贴upload.gradle 文件,这个脚本文件的内容基本是固定的。
    注意:区分上传的是har包还是jar包,需要对应修改upload.gradle文件中from 属性,发布har包使用字段components.release,发布jar包使用components.javahljs-center DSC0000.png
  • 注意:upload.gradle文件包含敏感信息,不能上传到gitee代码仓库。打开项目根目录.gitignore文件,添加upload.gradle,防止upload.gradle文件不小心上传到gitee远程代码仓库。
  • 进入准备发布版本的组件库module library目录,打开build.gradle文件,对应修改 DEFAULT_GROUP_ID(组件发布地址不变的话,就不用改)、DEFAULT_ARTIFACT_ID(项目名称)、DEFAULT_VERSION(组件Maven版本号)参数。
  • 打开项目根目录下的README.md文件,修改集成指引
DSC0001.png

双击执行publishing 任务下的publish进行版本发布,底部build、run选项窗口无报错信息则说明版本已经发布成功
DSC0002.png


  • 验证:进入Nuxes仓库管理平台查看已发布的版本,Nuxex管理平台链接https://s01.oss.sonatype.org/,打开 release仓库查看自己发布的版本,不登录也能查看。
DSC0003.png


  • maven发布完成后,可以在gitee项目中添加一个tag标签(可选操作)。
    Tag标签命名和发布到maven中心仓库的版本号对应。目前我们项目只有master分支,所以只需要在master添加tag标签即可,后期有其他分支再根据业务需求进行调整。
    打开gitee官网https://gitee.com,进入项目新建一个tag标签,如下图:
DSC0004.png
DSC0005.png
DSC0006.png

2 组件HAPM发布

2.1:前提条件:
配置HPM
1、node.js安装
进入nodejs官网https://nodejs.org/en/download/,下载安装node.js,已经安装node.js请跳过此步骤。(注意不要更改默认安装路径)
DSC0007.png

安装完成之后,使用执行cmd命令查看node版本号:node -v
DSC0008.png

2、hpm 安装
  • 执行命令安装hpm,安装命令  npm install –g @hpm/hpm-cli
    注意:如果提示代理问题造成的安装失败,可以到C:\Users\xxxx找到.npmrc文件,把该文件删除,再尝试安装
DSC0009.png


  • 执行命令查看hpm版本
DSC00010.png


  • 配置密钥(用了别人账号的,只要是不同的电脑,就要重新配置)
    • 进入https://hpm.harmonyos.com/hapm/#/cn/home,进入个人中心,查看邀请码

DSC00011.png

  • 在cmd命令行窗口执行以下命令配置用户信息:
    hpm config set loginUser 邀请码
DSC00012.png

  • 在cmd命令行窗口执行以下命令生成密钥:hpm gen-keys
    成功后会在C:\Users\xxxx.hpm\key下生成两个文件
DSC00013.png


  • 登录hpm北向组件官网:https://hpm.harmonyos.com/hapm/#/cn/home ,在个人中心的SSH公钥管理模块中,添加公钥,并将公钥文件(publicKey-XXXXX.pem)的内容粘贴到公钥输入框中。
DSC00014.png

DSC00015.png

2.1 HAPM介绍和准备工作:
HAPM介绍: https://hpm.harmonyos.com/hapm/#/cn/help/introduction
准备工作:    https://hpm.harmonyos.com/hapm/#/cn/help/preparation

2.2 HAPM发布模板
对应修改library级别的build.gradle 文件的rootProject属性,内容如下:
apply plugin: 'com.huawei.ohos.library'
apply from: '../upload.gradle'

rootProject.ext {
  DEFAULT_GROUP_ID = '按照实际的GROUP_ID为准' // 请以申请maven注册时的groupid为准,这个属性不用改
  DEFAULT_ARTIFACT_ID = '按照实际的ARTIFACT_ID为准' // 建议填写组件的仓名,单个lib库的就直接仓名,多个lib库的就以仓名+各lib后缀
  DEFAULT_VERSION = 'VERSION_ID'// 在 https://s01.oss.sonatype.org/#/welcome 上查找对应组件的版本号
  LIB_HOME_URL = '' // 组件官网网站主页,没有就留空
  LICENSES_NAME = 'The Apache License, Version 2.0' // License名称,以实际为准
  LICENSES_URL = 'https://gitee.com/openharmony-tpc/Highlight/blob/master/LICENSE' // gitee上对应组件的license地址,以实际为准
  HPM_DESCRIPTION = 'A library with high directivity for hap.' // 组件描述(注意编码格式,确保没有乱码),以实际为准
  HPM_TAG = 'UI'  // 分类,多个分类以逗号分隔。这样配置发布HAPM成功后,在HAPM上该组件会被归类到UI分组;固定列表中选择
  HPM_KEYWORDS = 'Highlight' // 关键字,多个关键字以逗号分隔。HAPM上搜索这里配置的关键字可以查找到对应组件,以实际为准
  HPM_DIRS = '{"lib":["build/outputs/*ar/release/*.*ar"]}' //将build/outputs/*ar/release/下的所有*ar文件打包到lib目录下,jar包路径可能为build/libs/*.*ar,以实际位置为准
}

ohos {
  compileSdkVersion 5
  defaultConfig {
    compatibleSdkVersion 5
  }

}

dependencies {
  implementation fileTree(dir: 'libs', include: ['*.jar'])
  testCompile 'junit:junit:4.12'
}
工程根目录upload.gradle文件中增加发布HAPM的task模板,内容如下:
apply plugin: 'maven'
apply plugin: 'maven-publish'

task publish2hpm {
  doLast {
    pom {
      project {
        version = rootProject.ext.DEFAULT_VERSION // 要发布组件的版本号
        groupId = rootProject.ext.DEFAULT_GROUP_ID // GroupID
        artifactId = rootProject.ext.DEFAULT_ARTIFACT_ID // 项目名称,单库的就直接项目名,多库的就项目名+后缀
        description(rootProject.ext.HPM_DESCRIPTION) // 组件描述
        url rootProject.ext.LIB_HOME_URL // 组件主页地址
        licenses {
          license {
            // license的配置请以当前库的实际license为准,url也请使用gitee上对应组件的license,如果原库根目录下没有LICENSE文件,只有README中有,就自己在根目录下新建一个LICENSE文件,内容复制README中的内容。
            // 例如:https://gitee.com/openharmony-tpc/Highlight/blob/master/LICENSE
            name = rootProject.ext.LICENSE_NAME
            url = rootProject.ext.LICENSE_URL
          }
        }
        scm {
          // 组件gitee仓库地址,这里也要换成自己的gitee仓库地址,此处仅以华为的为例进行说明,请以自己公司或者个人的为准
          connection = "scm:git:https://gitee.com/openharmony-tpc/" + rootProject.ext.DEFAULT_ARTIFACT_ID + ".git"
          url = 'https://gitee.com/openharmony-tpc/' + rootProject.ext.DEFAULT_ARTIFACT_ID
        }
        properties = [
            // @opensource是hapm上的发布者名称,DEFAULT_ARTIFACT_ID'为项目名
            'hpm.bundle.name'  : '@opensource/' + rootProject.ext.DEFAULT_ARTIFACT_ID,
            'hpm.bundle.tags'  : rootProject.ext.HPM_TAG,// tags需要填写一定范围内的词语,只能填一个
            'hpm.bundle.keywords': rootProject.ext.HPM_KEYWORDS,
            'hpm.bundle.dirs'  : rootProject.ext.HPM_DIRS
        ]
      }
    }.writeTo("pom4hpm.xml")
    def proc
    if (System.properties['os.name'].contains('Windows')) {
      proc = 'hpm.cmd x2h gradle'.execute()
    } else {
      proc = 'hpm x2h gradle'.execute()
    }
    proc.waitForProcessOutput(System.out, System.err)
    def pom4hpm = file("./pom4hpm.xml")
//    delete pom4hpm
  }
}
2.2 hapm发布步骤
  • 在项目根目录粘贴upload.gradle 文件,这个脚本文件的内容基本是固定的,除个别需求,不需要修改。
    注意:多库组件发布时,需注释掉已经上传完毕的build.gradle文件中的hapm相关配置信息,否则可能会导致后上传的库信息被覆盖。
  • 注意:upload.gradle文件包含敏感信息,不能上传到gitee代码仓库。打开项目根目录.gitignore文件,添加下面内容,防止upload.gradle文件不小心上传到gitee远程代码仓库。
DSC00016.png

  • 生成Release版本的har,要上传hapm模块下,执行packageReleaseHar,修改生成har名字为对应版本。
DSC00017.png


(可选:修改har包名称)生成的har包用于配置upload中 hpm.bundle.dirs属性,dirs里配置我们希望打包并发布到HAPM的文件,其中lib名字可以自定义,lib的值为har文件路径。我们发布的jar/har包文件名称,应该这样定义:库名称-版本号.jar/库名称-版本号.har,这样就和发布maven中心仓的jar/har对应了。
DSC00018.png


  • 进入准备发布版本的组件库module目录,打开build.gradle文件,对应修改 DEFAULT_GROUP_ID(组件发布地址不变,不用改)、DEFAULT_ARTIFACT_ID(单库的就直接项目名,多库的就项目名+后缀)、DEFAULT_VERSION(hapm组件版本号)、LIB_HOME_URL(组件官网地址_主页)、LICENSES_NAME(License名称)、LICENSES_URL(组件的License文件地址)、HPM_DESCRIPTION(组件描述)、HPM_TAG(组件分类)、HPM_KEYWORDS(组件搜索关键字)、HPM_DIRS(组件生成的har包路径,不用修改)参数。
    组件分类参照:
DSC00019.png

  • 粘贴README.md文件、 LICENSE文件及CHANGELOG.md(选加)文件到lib模块根目录,不要添加进git版本管理。
    如果一个组件他的license申明只写在了readme的末尾,工程根目录下没有单独的LICENSE文件,那么我们在发布hapm的时候,应该在工程根目录新建一个LICENSE文件,复制readme中的内容,并且提交到gitee, 最后再发布hapm
    为保证HAMP上也能正常显示gif动图,请修改readme中的图片链接为gitee图片的在线绝对路径链接。例:
      其中blob节点改成raw。
    由于gitee上图片显示限制1M,超出1M的图片在HAPM系统上无法显示图片,可以自行把图片发布到到其他网站托管,引用其在线链接即可。
  • (可选: hpm-cli 版本为1.3.0,不必执行此步骤)使用cmd 打开控制台,更新 hpm-cli 版本到 1.3.0,(更新命令:npm update -g @ohos/hpm-cli),如已更新,不必执行此步骤。
    验证hpm-cli版本的命令 hpm --version
DSC00020.png

更新 hpm-cli,命令 npm update -g @ohos/hpm-cli,如果执行命令之后开始执行更新,请等待
DSC00021.png

  • (可选:如已确定jar/har已打包成功,可不执行此步骤)确保发布包内容正确验证:upload.gradle中命令行中添加 -p ,在命令中添加 -p 的意思是只打包不发布。
DSC00022.png

修改完成后保存,双击publish2hpm,然后会生成一个包含发布信息的tgz压缩包,如下图
DSC00023.png

将组件生成的tgz压缩包,粘到外面的文件夹,解压。
DSC00024.png

检查bundle.json内容是否正确,是否包含dirs属性,各字段以实际为准。
DSC00025.png

如果包含,删除 upload.gradle中的 -p,准备正式发布。
  • 使用gradle 快捷命令 publish2hapm进行发布,执行成功即可。
  • 验证,发布成功(有审核期,审核通过后)后,进入HAPM平台,下载发布成功的版本,解压查看是否包含我们希望打包发布的文件,如下图所示
DSC00026.png

DSC00027.png

附录: IDE 官方下载地址
IDE官方下载地址:https://developer.harmonyos.com/cn/develop/deveco-studio
想了解更多关于鸿蒙的内容,请访问:
51CTO和华为官方战略合作共建的鸿蒙技术社区
https://harmonyos.51cto.com/#bkwz



关注下面的标签,发现更多相似文章