HarmonyOS 私仓搭建

1. HarmonyOS 私仓搭建

私仓搭建文档https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-ohpm-repo-quickstart-V5

发布共享包[https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-har-publish-0000001597973129-V5\]

1.1. 说明

在Android和iOS开发中很多时候都以以二进制的产物的方式进行依赖和协作,Android基于Mave为仓库,iOS有Pod为仓库,我们可以在官方提供的的平台使用别人开放的库,极大的提高了大家的开发效率。但是有些公司业务相关的库并不想被外部人员使用,上传到外部共有的仓库就不是很安全,很多公司在内部搭建了私有仓库,一方面更加安全,另一方面平时推拉产物也更快。

鸿蒙也是同样的问题,我们可以方便的在官方仓库平台使用三方开放的产物,但是公司内部业务还是需要依赖私有仓库,本文基于官方提供的工具搭建属于自己的私有仓库。

本文介绍了鸿蒙平台私仓搭建以及私仓共享包依赖与发布流程,并介绍了工模块依赖的复杂应用场景一键打包上传的场景实践。

1.2. 鸿蒙共享包介绍

鸿蒙共享包分静态共享包和动态共享包:

HAR(Harmony Archive)是静态共享包,可以包含代码、C++库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP,不能独立安装运行在设备上,只能作为应用模块的依赖项被引用。

HSP(Harmony Shared Package)是动态共享包,静态共享包会打包到每个依赖的HAP里,这样导致包体积较大,且有重复多份公共资源和代码重复打包到应用中,动态共享包可以让多个HAP能够共享同一公共资源代码。HSP只支持在应用内共享,不支持跨应用共享

1.3. ohpm-repo私仓工具搭建私仓

官方提供了ohpm-repo工具帮助开发者快速搭建轻量级的ohpm私有仓库,与 ohpm 包管理器兼容,并按需缓存所有依赖项,加速私有网络中的安装。

ohpm-repo 支持单点部署和多实例部署:

(1)单点部署:ohpm-repo 仅部署在一台机器上使用。

(2)多实例部署:ohpm-repo 会部署到多台机器中,具有相同的配置内容,并且共享数据存储空间。

1.3.1. 依赖环境安装

ohpm-repo 依赖于 node 运行,支持 node.js 16.x 及以上版本,需要先安装 nodejs,并进行环境配置。NodeJs安装可以从官网(https://nodejs.org/download/release/latest/)下载。

1.3.2. 下载ohpm-repo工具

(1)下载ohpm-repo工具,下载地址:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-software-download-0000001507075446

(2)解压ohpm-repo工具

1.3.3. 配置ohpm-repo环境变量

将ohpm-repo工具包解压目录中bin目录的路径配置到系统环境变量path中:export PATH= O H P M − R E P O − P A T H / b i n : OHPM-REPO-PATH/bin: OHPM−REPO−PATH/bin:PATH

执行命令ohpm-repo -v查看版本号,验证解压包完整无损

1.3.4. ohpm-repo服务配置文件配置

进入解压目录的conf目录,打开config.yaml文件,默认配置如下:

javascript 复制代码
##### server configuration section #####
listen: localhost:8088        # 建议修改为具体的ip/域名
# listen:
# - localhost:8088            # 监听本机环回地址
# - http://localhost:8088     # 监听本机环回地址
# - 0.0.0.0:8088              # 监听本机所有地址 (INADDR_ANY)
# 协议可配置 http 或者 https,默认为 http
# port: 1-65535(Window系统)/ 1024-65535(Linux或Mac系统)

# 可选 (listen 为 https 协议时必须配置)
https_key: ''                 # https 服务使用的 key 的路径  (不配置默认为'')
https_cert: ''                # https 服务使用的 crt 的路径  (不配置默认为'')

##### server deploy root section #####
deploy_root: ''                # 安装根目录 (不配置默认为 `<现有用户home目录>/ohpm-repo`),只支持绝对路径,且路径目录必须存在

##### server numeric limit section #####
max_package_size: 300          # 上传包大小限制,单位是MB (0, 300],不配置默认为 300
max_extract_size: 800          # 压缩包解压后大小限制,单位是MB ,不配置默认为 800
max_extract_file_num: 30000    # 压缩包解压后文件个数限制,默认为30000个
user_rate_limit: 100           # 用户访问频率控制,单位是次/s (0, 10000],不配置默认为 100
fetch_timeout: 60              # 请求/响应的超时时间,单位是秒 (0, 3600],不配置默认为 60
keep_alive_timeout: 60         # TCP 保持连接的超时时间,单位是秒 (0, 3600],不配置默认为 60
api_timeout: 60                # api超时时间,单位是秒(0, 3600],不配置默认为 60
upload_lock_hour: 24           # 下架某一三方包所有版本后,限时禁止同名三方包上传,单位是小时 (0, 168],不配置,默认为 24
upload_max_times: 100          # 单用户24小时内上传次数限制 (0, 100000],不配置默认为 100
operation_log_retention: 100   # 数据库中操作日志保留时间,单位是天,不配置默认为 100
##### metadata storage section #####
## 数据存储类型 filedb 和 mysql 二选一,不可都配置
db:                         # 必须用 yaml 数组形式写法
  type: filedb
  config:                   # 如果想修改存储路径且保留旧的数据,则需要把旧路径下的数据文件迁移至新路径
    path: ./db              # 本地数据存储路径,不配置默认为<deploy_root>/db;

#db:                        # 必须用yaml数组形式写法
#  type: mysql
#  config:
#    host: "localhost"      # 数据库主机地址
#    port: 3306             # 数据库端口 (0,65535]
#    username: tctAdmin         # 数据库的用户名
#    password: "password"   # 数据库的用户密码(请配置明文, 最终在部署目录中会转换为密文)
#    database: "repo"       # 数据库名

##### storage section #####
## 文件存储类型fs,sftp 和 custom 三选一,不可多选。

store:                               # 必须用 yaml 数组形式写法
  type: fs
  config:                            # 上传资源后如若要修改存储路径,则需要把旧路径下的数据迁移至新路径中
    path: ./storage                  # 已上架三方库存储路径,不配置默认为 <deploy_root>/storage;
    #server: http://localhost:8088   # 仓库下载链接地址,不配置取默认值

# 文件存储类型为 sftp 时,最多配置三个 sftp
#store:                               # 必须用 yaml 数组形式写法
#  type: sftp                         # 当且仅当 db 的类型为 mysql 时,store 的类型才能为 sftp
#  config:
#    location:
#      -
#        name: test_one_sftp          # 主机名字名字不能与其他sftp配置重复
#        host: "localhost"            # 主机地址
#        port: 22                     # 主机端口 (0,65535]
#        read_username: "read"        # 主机有读权限的用户名字
#        read_password: "password"    # 主机有读权限的用户密码(请配置明文, 最终在部署目录中会转换为密文)
#        write_username: "write"      # 主机有写权限的用户名字
#        write_password: "password"   # 主机有写权限的用户密码(请配置明文, 最终在部署目录中会转换为密文)
#        path: /source22              # 相对 sftp 根目录的文件路径,仅限/开头,且路径文件夹必须存在
#      -
#        name: test_two_sftp
#        host: "localhost"
#        port: 24
#        read_username: "read"
#        read_password: "password"
#        write_username: "write"
#        write_password: "password"
#        path: /source24
#    #server: http://localhost:8088   # 仓库下载链接地址,不配置取默认值

#store:
#  type: custom                                            # custom是自定义存储插件类型,自定义存储插件开发流程见指导文档
#  config:
#    export_name: CustomStorage                            # 插件export的类名
#    plugin_path: plugins/CustomStorage.js                 # 插件的绝对路径或者相对于ohpm-repo软件包的路径,建议将插件放在软件包的plugins目录下
#    custom_field: "test"                                  # 自定义字段,通过引入libs/common/getStorageConfigInfo.js的getStorageConfigInfo方法获取自定义字段的值
#    #server: http://localhost:8088                        # 仓库下载链接地址,不配置取默认值
##### 是否使用反向代理 #####
# 可选项:true,false, 默认:false。如果使用反向代理,需要配置为true,客户端IP地址将从请求头中的x-forwarded-for字段获取
use_reverse_proxy: false
##### uplink section #####
uplink_cache_path: ./uplink      # 缓存路径,不配置默认为 <deploy_root>/uplink
uplink_cache_time: 168           # 远程包 metadata 缓存时间,单位为小时,默认 168 小时,取值范围为 (0, 8760]

##### log section #####
logs_path: ./logs                # 日志路径,不配置默认为 <deploy_root>/logs

##### log level section #####
# 日志级别: 级别由低到高分别是 all、trace、debug、info、warn、error、fatal、mark、off
# run,operate 和 access 不配置或者配置错误,默认为 info
loglevel_run: info
loglevel_operate: info
loglevel_access: info

##### auth plugin section #####
# 可选项,自定义认证插件配置
#auth_plugin:
#  name: CustomAuth              # 认证插件的名字
#  path: plugins/CustomAuth.js   # 插件的绝对路径或者相对于ohpm-repo软件包的路径,建议将插件放在软件包的plugins目录下

##### compatibleSdkVersion等兼容性字段检测日志等级 #####
# 可选值:close、info、warn、error,默认:warn
compability_log_level: warn

##### 是否允许下架被其他组件依赖的包 #####
# 可选项:true,false, 默认:false
allow_remove_depended_packages: false

##### 是否使用文件上传新接口 #####
# 可选项:true,false, 默认:true
allow_new_file_upload_api: true

包含监听端口、https配置、私仓部署目录deploy_root、服务相关配置server、存储配置db、日志logs等,按照实际情况配置即可。

关于存储模块:

db是元数据存储的配置项,db支持fileDB本地存储和mysql数据库存储

store是文件存储的配置项,store支持local storage本地存储,sftp storage存储和custom storage 自定义插件存储。

1.3.5. 私仓成功启动后修改配置文件方法:

首次启动私仓时执行install命令指定配置文件:找到指定的配置文件进行文件内容修改,然后重新执行install指定修改后的配置文件,再执行start启动私仓。

首次启动私仓时执行install命令未指定配置文件:默认使用私仓压缩包解压路径下conf目录中的配置文件,修改该文件内容,然后重新执行install和start操作。

1.3.6. 安装启动

执行ohpm-repo install安装,安装完成后根据配置设置环境变量,设置完成后执行ohpm-repo start启动服务。

1.4. 使用私仓共享包

默认情况客户端ohpm工具,拉取依赖包只会从官方公开仓库拉取,想从私仓拉取需要进行额外的配置,配置方式有两种:

(1)为所有项目配置该私有仓:1. ohpm config set registry <配置的私仓服务地址>/repos/ohpm

(2)针对某次依赖安装配置:1. ohpm install @ohos/lottie --registry <配置的私仓服务地址>/repos/ohpm

上面配置的私仓服务地址是配置文件中 store.config.server 的地址信息,例如: store.config.server :为 http://127.0.0.1:8088,则 registry 为:http://127.0.0.1:8088/repos/ohpm。如果store.config.server 没有配置,取默认值。

1.5. 发布共享包

本地开发的共享包不管是静态共享包还是动态共享包,都可以通过ohpm命令工具或者使用Web页面来发布,一般开发工作中为了方便和效率,我们都使用命令行发布。

(1)本地生成ssh秘钥:1. ssh-keygen -m PEM -t RSA -b 4096 -f <your_key_path>

(2)登录 ohpm-repo 私仓管理地址,单击主页右上角的个人中心,新增公钥,将公钥文件(<your_key_path>.pub)的内容粘贴到公钥输入框中。

设置私钥路径:ohpm config set key_path <your_key_path>

(2)登录 ohpm-repo 私仓管理地址,单击主页右上角的个人中心,复制发布码。

(3)将发布码配置到 .ohpmrc 文件中:ohpm config set publish_id <your_publish_id>

(3)发布静态共享库:ohpm publish demo.har

(4)发布动态共享:ohpm publish demo.tgz

(5)动态共享包 HSP 包不能直接发布在私仓内,需要先转化为 .tgz 包

(5)将编译模式切换成release模式会打包出.taz包

1.5.1. 模块配置

(在库模块中(与src文件夹同一级目录下),添加如下文件:

(新建README.md文件:在README.md文件中必须包含包的介绍和引用方式,还可以根据包的内容添加更详细介绍。

(新建CHANGELOG.md文件:填写HAR的版本更新记录。

(添加LICENSE文件:LICENSE许可文件。

(README.md文件最终会展示在私仓网页平台,依赖使用方可以根据README.md说明直接使用,所以最好描述清晰。

(oh_package.json5配置文件说明:

javascript 复制代码
{  
    "parameterFile": "../dependencies.json5",  
    "keywords": [  
        "asr"  
    ],  
    "name": "@xx/base-asr",  
    "version": "1.0.0-rc.9",  
    "repository": "http://gerrit.google.com/mobile_harmony/base_asr",  
    "description": "asr sdk",  
    "main": "Index.ets",  
    "author": "qingkouwei",  
    "license": "Apache-2.0",  
    "dependencies": {  
        
    }  
}

模块名称,版本号,说明都要符合要求,否会会上传私仓失败。版本号只能依次递增,无法向Android一样一个SNAPSHOT无限覆盖。

1.6. 场景实践

在实际开发过程中,一个工程可能会有多个SDK,SDK开发完成需要接入到其他工程,有事在定位问题调试时可能要频繁的上传到私仓,其他工程依赖打包后调试,这样每次编译sdk,在执行命令上传特别繁琐,效率低下,特别是一个工程有多个SDK,并且SDK还有依赖的情况下。

最好的办法是可以通过脚本一键编译和上传到私仓,并且根据依赖关系依次上传,也可以单独打包上传某个module。

先创建一个version.json5存放SDK版本:

javascript 复制代码
{  
  "project": {  
    "sdk_version": "1.1.0-rc.1",  
  }  
}

自动打包:

javascript 复制代码
def run_commands(modulename, productname):  
    hvigor_home = '/Applications/DevEco-Studio.app/Contents/tools/hvigor'  
  
    # 打包命令
    command1 = 'node %s/bin/hvigorw.js --mode module -p product=default -p module=%s@default -p buildMode=debug assembleHar --analyze --parallel --incremental --daemon' %(hvigor_home,modulename)  
  
    # 等待第一个命令执行完成  
    process1.wait()  
  
    # 上传命令  
    ohpm publish productname
    process2.wait()
}

自动修改版本号:

javascript 复制代码
def changeVersionAModule():  
    with open('version.json5', 'r') as f:  
        data = json5.load(f)  
        versionName = data['project']['sdk_version']  
  
        with open('AModule/oh-package.json5', 'r') as f:  
            aData = json5.load(f)  
            aData['version'] = versionName  
            with open('AModule/oh-package.json5', 'w') as f:  
                json.dump(aData, f, indent=4)  
  
        with open('dependencies.json5', 'r') as depf:  
            depData = json5.load(depf)  
            depData['version_base']['base-a'] = versionName  
            with open('dependencies.json5', 'w') as depf:  
                json.dump(depData, depf, indent=4)
相关推荐
SameX4 小时前
HarmonyOS Next 安全生态构建与展望
前端·harmonyos
SameX4 小时前
HarmonyOS Next 打造智能家居安全系统实战
harmonyos
Random_index11 小时前
#Uniapp篇:支持纯血鸿蒙&发布&适配&UIUI
uni-app·harmonyos
鸿蒙自习室15 小时前
鸿蒙多线程开发——线程间数据通信对象02
ui·harmonyos·鸿蒙
SuperHeroWu717 小时前
【HarmonyOS】鸿蒙应用接入微博分享
华为·harmonyos·鸿蒙·微博·微博分享·微博sdk集成·sdk集成
zhangjr057520 小时前
【HarmonyOS Next】鸿蒙实用装饰器一览(一)
前端·harmonyos·arkts
诗歌难吟4641 天前
初识ArkUI
harmonyos
SameX1 天前
HarmonyOS Next 设备安全特性深度剖析学习
harmonyos
郭梧悠1 天前
HarmonyOS(57) UI性能优化
ui·性能优化·harmonyos
郝晨妤2 天前
鸿蒙原生应用开发元服务 元服务是什么?和App的关系?(保姆级步骤)
android·ios·华为od·华为·华为云·harmonyos·鸿蒙