1e41f4b71Sopenharmony_ci# HPM Part参考 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ci 4e41f4b71Sopenharmony_ci本文档将介绍HPM的Part的构成,包类型、划分原则、元数据字段以及相关命令行工具的常用命令等。 5e41f4b71Sopenharmony_ci 6e41f4b71Sopenharmony_ci 7e41f4b71Sopenharmony_ci### Part划分原则 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ci原则上应尽可能划分为细颗粒度的Part,以满足最大限度的复用。主要考虑以下几点: 10e41f4b71Sopenharmony_ci 11e41f4b71Sopenharmony_ci- 独立性:Part的功能应该相对独立,支持独立编译,可以单独对外提供接口和服务; 12e41f4b71Sopenharmony_ci 13e41f4b71Sopenharmony_ci- 耦合性:如果Part必须依赖其他的Part,才能对外提供服务,应考虑和被依赖的Part合并为一个Part。 14e41f4b71Sopenharmony_ci 15e41f4b71Sopenharmony_ci- 相关性:如果一组Part共同完成一项功能,且没有被其他Part依赖,未来也没有被依赖的可能,则可以考虑合并为一个Part。 16e41f4b71Sopenharmony_ci 17e41f4b71Sopenharmony_ci 18e41f4b71Sopenharmony_ci### Part类型 19e41f4b71Sopenharmony_ci 20e41f4b71Sopenharmony_ciPart是为复用而生,一切可以复用的部件都可以定义为Part,可以分为: 21e41f4b71Sopenharmony_ci 22e41f4b71Sopenharmony_ci **表1** HPM Part分类 23e41f4b71Sopenharmony_ci 24e41f4b71Sopenharmony_ci| 部件 | 说明 | 25e41f4b71Sopenharmony_ci| -------- | -------- | 26e41f4b71Sopenharmony_ci| source | 以源码形式分发,被目标工程依赖、可独立编译。 | 27e41f4b71Sopenharmony_ci| binary | 以二进制形式分发,不包含源代码,例如编译工具。 | 28e41f4b71Sopenharmony_ci| code-segment | 以代码片段形式分发,无法独立编译,安装后还原到指定目录,在目标工程参与其他代码编译。 | 29e41f4b71Sopenharmony_ci| distribution | 以发行版形式分发,依赖其他Part,不包含源码(编译脚本除外),编译输出为系统镜像。 | 30e41f4b71Sopenharmony_ci| template | 以模板形态分发,用于hpm init创建模板。 | 31e41f4b71Sopenharmony_ci| plugin | 以插件形态分发,作为hpm cli的插件,扩展hpm cli的功能。 | 32e41f4b71Sopenharmony_ci 33e41f4b71Sopenharmony_ci 34e41f4b71Sopenharmony_ci### Part构成 35e41f4b71Sopenharmony_ci 36e41f4b71Sopenharmony_ci一个Part包一般包含如下内容: 37e41f4b71Sopenharmony_ci 38e41f4b71Sopenharmony_ci- Part包的代码或库(src目录下的代码文件) 39e41f4b71Sopenharmony_ci 40e41f4b71Sopenharmony_ci- ohos_bundles文件夹(存放依赖的Part,安装Part时自动生成,无需提交到代码库) 41e41f4b71Sopenharmony_ci 42e41f4b71Sopenharmony_ci- Part包的说明文件(README.md) 43e41f4b71Sopenharmony_ci 44e41f4b71Sopenharmony_ci- Part包元数据声明文件(bundle.json) 45e41f4b71Sopenharmony_ci 46e41f4b71Sopenharmony_ci- 开源许可文件(LICENSE) 47e41f4b71Sopenharmony_ci 48e41f4b71Sopenharmony_ci ``` 49e41f4b71Sopenharmony_ci my-bundle 50e41f4b71Sopenharmony_ci |_ohos_bundles 51e41f4b71Sopenharmony_ci |_headers 52e41f4b71Sopenharmony_ci |_src 53e41f4b71Sopenharmony_ci |_bundle.json 54e41f4b71Sopenharmony_ci |_README.md 55e41f4b71Sopenharmony_ci |_LICENSE 56e41f4b71Sopenharmony_ci ``` 57e41f4b71Sopenharmony_ci 58e41f4b71Sopenharmony_ci 59e41f4b71Sopenharmony_ci### src源代码 60e41f4b71Sopenharmony_ci 61e41f4b71Sopenharmony_ciPart的代码文件和普通的代码目录没有差异。但要注意的是,Part中对外暴露的接口(头文件),会被其他Part所引用,需要单独在bundle.json的dirs中声明。 62e41f4b71Sopenharmony_ci 63e41f4b71Sopenharmony_ci 64e41f4b71Sopenharmony_ci### README文件 65e41f4b71Sopenharmony_ci 66e41f4b71Sopenharmony_ci为了帮助他人在[DevEco Marketplace](https://repo.harmonyos.com)上找到该Part,并更方便的使用它,在Part的根目录中包含一个README文件。 67e41f4b71Sopenharmony_ci 68e41f4b71Sopenharmony_ciREADME.md,为markdown格式的描述关于Part自述说明文件。 69e41f4b71Sopenharmony_ci 70e41f4b71Sopenharmony_ciREADME文件应包括如何安装,配置和使用Part包中的实例代码说明,以及可能会对用户有所帮助的任何其他信息。 71e41f4b71Sopenharmony_ci 72e41f4b71Sopenharmony_ci自述文件将显示在[DevEco Marketplace](https://repo.harmonyos.com)的Part的详情页面中。 73e41f4b71Sopenharmony_ci 74e41f4b71Sopenharmony_ci 75e41f4b71Sopenharmony_ci## bundle.json文件 76e41f4b71Sopenharmony_ci 77e41f4b71Sopenharmony_cibundle.json文件是对当前Part的元数据描述,每个Part中必须包含一个bundle.json文件。主要内容如下: 78e41f4b71Sopenharmony_ci 79e41f4b71Sopenharmony_ci 80e41f4b71Sopenharmony_ci``` 81e41f4b71Sopenharmony_ci{ 82e41f4b71Sopenharmony_ci "name": "@myorg/demo-bundle", 83e41f4b71Sopenharmony_ci "version": "1.0.0", 84e41f4b71Sopenharmony_ci "license": "MIT", 85e41f4b71Sopenharmony_ci "description": "bundle description", 86e41f4b71Sopenharmony_ci "keywords": ["hos"], 87e41f4b71Sopenharmony_ci "tags": ["applications", "drivers"], 88e41f4b71Sopenharmony_ci "author": {"name":"","email":"","url":""}, 89e41f4b71Sopenharmony_ci "contributors":[{"name":"","email":"","url":""},{"name":"","email":"","url":""}], 90e41f4b71Sopenharmony_ci "homepage": "http://www.foo.bar.com", 91e41f4b71Sopenharmony_ci "repository": "https://git@gitee.com:foo/bar.git", 92e41f4b71Sopenharmony_ci "private": false, 93e41f4b71Sopenharmony_ci "publishAs": "code-segment", 94e41f4b71Sopenharmony_ci "segment":{ 95e41f4b71Sopenharmony_ci "destPath":"/the/dest/path" 96e41f4b71Sopenharmony_ci }, 97e41f4b71Sopenharmony_ci "dirs": { 98e41f4b71Sopenharmony_ci "src": ["src/**/*.c"], 99e41f4b71Sopenharmony_ci "headers": ["headers/**/*.h"], 100e41f4b71Sopenharmony_ci "bin": ["bin/**/*.o"] 101e41f4b71Sopenharmony_ci }, 102e41f4b71Sopenharmony_ci "scripts": { 103e41f4b71Sopenharmony_ci "build": "make" 104e41f4b71Sopenharmony_ci }, 105e41f4b71Sopenharmony_ci "envs": {}, 106e41f4b71Sopenharmony_ci "ohos": { 107e41f4b71Sopenharmony_ci "os": "2.0.0", 108e41f4b71Sopenharmony_ci "board": "hi3516", 109e41f4b71Sopenharmony_ci "kernel": "liteos-a" 110e41f4b71Sopenharmony_ci }, 111e41f4b71Sopenharmony_ci "rom": "10240", 112e41f4b71Sopenharmony_ci "ram": "1024", 113e41f4b71Sopenharmony_ci "dependencies": { 114e41f4b71Sopenharmony_ci "@myorg/net":"1.0.0" 115e41f4b71Sopenharmony_ci } 116e41f4b71Sopenharmony_ci} 117e41f4b71Sopenharmony_ci``` 118e41f4b71Sopenharmony_ci 119e41f4b71Sopenharmony_cibundle.json文件具有如下功能: 120e41f4b71Sopenharmony_ci 121e41f4b71Sopenharmony_ci- name:定义Part的名称,放到组织下, 以\@开头,/分割,如:\@myorg/mybundle 122e41f4b71Sopenharmony_ci 123e41f4b71Sopenharmony_ci- version:定义Part版本号,如1.0.0,需满足semver的标准。 124e41f4b71Sopenharmony_ci 125e41f4b71Sopenharmony_ci- description:一句话对Part进行简要的描述。 126e41f4b71Sopenharmony_ci 127e41f4b71Sopenharmony_ci- dependencies:定义Part的依赖Part。 128e41f4b71Sopenharmony_ci 129e41f4b71Sopenharmony_ci- envs: 定义Part编译时所需要的参数,包括全局参数以及依赖所需的参数。 130e41f4b71Sopenharmony_ci 131e41f4b71Sopenharmony_ci- scripts:定义在当前Part下能够执行的命令(如编译,构建,测试,烧录等)。 132e41f4b71Sopenharmony_ci 133e41f4b71Sopenharmony_ci- publishAs:定义Part的发布类型(source:源码,binary:二进制,distribution:发行版,code-segment:代码片段)。 134e41f4b71Sopenharmony_ci 135e41f4b71Sopenharmony_ci- segment: 仅针对code-segment类型的Part,定义Part的目标路径(即安装后,Part包中包含的文件复制到的目标路径) 136e41f4b71Sopenharmony_ci 137e41f4b71Sopenharmony_ci- dirs:定义发布时打包的目录结构(如头文件)。 138e41f4b71Sopenharmony_ci 139e41f4b71Sopenharmony_ci- ram&rom:统计相关信息:预计占用ROM和RAM信息。 140e41f4b71Sopenharmony_ci 141e41f4b71Sopenharmony_ci- ohos:描述OpenHarmony操作系统版本、开发板及内核的匹配关系(多个请用英文逗号的“,”分割)。 142e41f4b71Sopenharmony_ci 143e41f4b71Sopenharmony_ci- 定义其他扩展信息:作者,主页,代码仓库,许可协议,标签,关键字。 144e41f4b71Sopenharmony_ci 145e41f4b71Sopenharmony_ci- 对于发行版类型,可以定义继承关系,用base字段描述继承自的基础发行版及版本。 146e41f4b71Sopenharmony_ci 147e41f4b71Sopenharmony_ci- private:定义是否为私有包,私有包在公共的注册中心中无法被其他用户搜索到,默认为false(只有组织的类型为)。 148e41f4b71Sopenharmony_ci 149e41f4b71Sopenharmony_ci 150e41f4b71Sopenharmony_ci## HPM CLI命令 151e41f4b71Sopenharmony_ci 152e41f4b71Sopenharmony_ciPart的全生命周期管理,可以通过hpm命令工具进行操作,hpm的操作命令如下(详细帮助可以执行hpm -h学习): 153e41f4b71Sopenharmony_ci 154e41f4b71Sopenharmony_ci **表2** hpm操作命令 155e41f4b71Sopenharmony_ci 156e41f4b71Sopenharmony_ci| 命令类别 | 命令行 | 含义说明 | 157e41f4b71Sopenharmony_ci| -------- | -------- | -------- | 158e41f4b71Sopenharmony_ci| 版本查询 | hpm -V或hpm --version | 查看hpm-cli版本号。 | 159e41f4b71Sopenharmony_ci| 帮助查询 | hpm -h或hpm --version | 查看命令列表及帮助。 | 160e41f4b71Sopenharmony_ci|| hpm -h | 查看命令帮助。 | 161e41f4b71Sopenharmony_ci| 创建 | hpm init bundle | 创建Part工程。 | 162e41f4b71Sopenharmony_ci|| hpm init -t template | 根据模板创建脚手架工程。 | 163e41f4b71Sopenharmony_ci| 安装 | hpm install或hpm i | 安装bundle.json中依赖的Part。 | 164e41f4b71Sopenharmony_ci|| hpm install bundle\@version | 安装指定Part版本。 | 165e41f4b71Sopenharmony_ci| 卸载 | hpm uninstall bundle | 删除depedencies依赖的Part。 | 166e41f4b71Sopenharmony_ci|| hpm remove或hpm rm bundlename | 删除depedencies依赖的Part。 | 167e41f4b71Sopenharmony_ci| 查看 | hpm list或者hpm ls | 显示当前HPM Part的依赖树。 | 168e41f4b71Sopenharmony_ci|| hpm dependencies | 生成当前HPM Part依赖关系数据(在hpm ui也集成了该命令的调用,可以图形化的展示) | 169e41f4b71Sopenharmony_ci| 搜索 | hpm search name | 搜索Bundle,--json,可以以json格式输出 -type 可以设置搜索Bundle的类型,包括part、distribution、code-segment三种。 | 170e41f4b71Sopenharmony_ci| 设置hpm配置项 | hpm config set key value | 设置配置值,如服务器地址,网络代理。 | 171e41f4b71Sopenharmony_ci|| hpm config delete key | 删除配置。 | 172e41f4b71Sopenharmony_ci| 更新 | hpm update | 更新当前Part依赖的Part的版本。 | 173e41f4b71Sopenharmony_ci|| hpm check-update | 检查依赖的Part版本是否有更新。 | 174e41f4b71Sopenharmony_ci| 编译 | hpm build | 编译HPM Part。 | 175e41f4b71Sopenharmony_ci|| hpm dist | 针对发行版(distribution),发行版编译构建(依赖bundle.json的scripts中的dist脚本)。 | 176e41f4b71Sopenharmony_ci| 打包 | hpm pack | 本地Part打包依赖。 | 177e41f4b71Sopenharmony_ci| 烧录 | hpm run flash | 烧录固件(依赖bundle.json的scripts中的flash脚本)。 | 178e41f4b71Sopenharmony_ci| 发布 | hpm publish | 发布Part,发布的Part在仓库中必须唯一,且版本唯一(需要账号登录)。 | 179e41f4b71Sopenharmony_ci| 执行扩展命令 | hpm run | 执行bundle.json文件中定义的scripts脚本命令,支持多个命令可用 && 连接。 | 180e41f4b71Sopenharmony_ci| 解压包 | hpm extract | 解压文件. 支持格式'zip'、'tar','tgz' 和'.tar.gz' | 181e41f4b71Sopenharmony_ci| 启动图形化界面 | hpm ui | 本地启动HPM UI,可通过-p参数指定端口,Windows平台下会启动默认的浏览器打开 | 182e41f4b71Sopenharmony_ci| 多语言切换 | hpm lang | 切换中英文操作界面(同时支持命令行和UI) | 183e41f4b71Sopenharmony_ci| 转换为hpm包格式 | hpm x2h | 将一个maven格式或npm格式包转换成hpm的包格式,并发布到HPM | 184e41f4b71Sopenharmony_ci| 代码段还原或清理 | hpm code clean\|restore | 针对依赖的代码段(code-segment)Part,执行清理或还原操作(即根据segment.destPath执行拷贝/删除操作) | 185e41f4b71Sopenharmony_ci| 生成秘钥 | hpm gen-keys | 生成公钥/私钥对,将公钥配置到[DevEco Marketplace](https://repo.harmonyos.com),可以实现hpm-cli免密登录,发布Part。 | 186e41f4b71Sopenharmony_ci| 生成第三方开源说明 | hpm gen-notice | 根据每个Part的说明,生成一份合并后的第三方开源说明的合并文件。 | 187e41f4b71Sopenharmony_ci 188e41f4b71Sopenharmony_ci 189e41f4b71Sopenharmony_ci## 关于依赖 190e41f4b71Sopenharmony_ci 191e41f4b71Sopenharmony_ciPart的依赖分为必选依赖和可选依赖。 192e41f4b71Sopenharmony_ci 193e41f4b71Sopenharmony_ci- 必选依赖:是指Part A在完成某个功能时,必须引入Part B,调用B的接口或服务配合才能完成。称B为A的必选依赖。 194e41f4b71Sopenharmony_ci 195e41f4b71Sopenharmony_ci- 可选依赖:是在Part A在完成某个功能时,可以引入Part C,也可以引入Part D。C和D可以相互替换,称C和D为A的可选依赖。 196e41f4b71Sopenharmony_ci 197e41f4b71Sopenharmony_ci 198e41f4b71Sopenharmony_ci``` 199e41f4b71Sopenharmony_ci"dependencies": { 200e41f4b71Sopenharmony_ci "@myorg/core":"1.0.0", 201e41f4b71Sopenharmony_ci "?@myorg/plugin1":"1.0.0", 202e41f4b71Sopenharmony_ci "?@myorg/plugin2":"1.1.0" 203e41f4b71Sopenharmony_ci } 204e41f4b71Sopenharmony_ci``` 205e41f4b71Sopenharmony_ci 206e41f4b71Sopenharmony_ciPart的依赖关系分为编译依赖和开发依赖。 207e41f4b71Sopenharmony_ci 208e41f4b71Sopenharmony_ci- 编译依赖:运行时需要的依赖。 209e41f4b71Sopenharmony_ci 210e41f4b71Sopenharmony_ci- 开发依赖:非运行时需要的依赖,如静态检查、编译、打包、测试、格式化工具等。 211e41f4b71Sopenharmony_ci 212e41f4b71Sopenharmony_ci 213e41f4b71Sopenharmony_ci``` 214e41f4b71Sopenharmony_ci"dependencies": { 215e41f4b71Sopenharmony_ci "@myorg/core":"1.0.0" 216e41f4b71Sopenharmony_ci }, 217e41f4b71Sopenharmony_ci"devDependencies": { 218e41f4b71Sopenharmony_ci "@myorg/tool":"1.0.0" 219e41f4b71Sopenharmony_ci } 220e41f4b71Sopenharmony_ci``` 221e41f4b71Sopenharmony_ci 222e41f4b71Sopenharmony_ci 依赖中可以定义标签,对引入的依赖进行分组。在脚本中可以根据标签,获得这一组依赖的路径。定义的标签以\#开头,具体定义的方式为: 223e41f4b71Sopenharmony_ci 224e41f4b71Sopenharmony_ci``` 225e41f4b71Sopenharmony_ci{ 226e41f4b71Sopenharmony_ci "dependencies": { 227e41f4b71Sopenharmony_ci "#tool": { 228e41f4b71Sopenharmony_ci "first_bundle": "1.0.0", 229e41f4b71Sopenharmony_ci "second_bundle": "1.0.0" 230e41f4b71Sopenharmony_ci }, 231e41f4b71Sopenharmony_ci "#drivers": { 232e41f4b71Sopenharmony_ci "xx_bundle": "1.0.0", 233e41f4b71Sopenharmony_ci "yy_bundle": "1.0.0" 234e41f4b71Sopenharmony_ci } 235e41f4b71Sopenharmony_ci } 236e41f4b71Sopenharmony_ci} 237e41f4b71Sopenharmony_ci``` 238e41f4b71Sopenharmony_ci 239e41f4b71Sopenharmony_ciPart的依赖关系(包括间接依赖)可以通过hpm list命令显示(也可以通过hpm ui命令在可视化的页面中显示) 240e41f4b71Sopenharmony_ci 241e41f4b71Sopenharmony_ci 242e41f4b71Sopenharmony_ci``` 243e41f4b71Sopenharmony_ci$ hpm list 244e41f4b71Sopenharmony_ci+--demo@1.0.0 245e41f4b71Sopenharmony_ci| +--@example/media@1.0.2 246e41f4b71Sopenharmony_ci| +--@demo/sport_hi3518ev300_liteos_a@1.0.0 247e41f4b71Sopenharmony_ci| | +--@demo/app@4.0.1 248e41f4b71Sopenharmony_ci| | | +--@demo/build@4.0.1 249e41f4b71Sopenharmony_ci| | | +--@demo/arm_harmonyeabi_gcc@4.0.0 250e41f4b71Sopenharmony_ci| | +--@demo/liteos_a@4.0.0 251e41f4b71Sopenharmony_ci| | | +--@demo/third_party_fatfs@4.0.0 252e41f4b71Sopenharmony_ci| | | +--@demo/arm_harmonyeabi_gcc@4.0.0 253e41f4b71Sopenharmony_ci| | +--@demo/init@4.0.0 254e41f4b71Sopenharmony_ci| | +--@demo/dist_tools@4.0.0 255e41f4b71Sopenharmony_ci``` 256e41f4b71Sopenharmony_ci 257e41f4b71Sopenharmony_ci 258e41f4b71Sopenharmony_ci## 关于环境变量 259e41f4b71Sopenharmony_ci 260e41f4b71Sopenharmony_ciPart在编译的过程中需要依赖系统提供的环境变量来自定义输出,链接所需二进制文件等。 261e41f4b71Sopenharmony_ci 262e41f4b71Sopenharmony_ci这里提出的环境变量均指根据需求把所需变量注入脚本执行的上下文中。 263e41f4b71Sopenharmony_ci 264e41f4b71Sopenharmony_ci所以在脚本中可以直接获取到变量的值。下面介绍当前系统存在的几种环境变量。 265e41f4b71Sopenharmony_ci 266e41f4b71Sopenharmony_ci**内置环境变量**: 267e41f4b71Sopenharmony_ci 268e41f4b71Sopenharmony_ci- DEP_OHOS_BUNDLES:表示ohos_bundles文件夹所在的路径。 269e41f4b71Sopenharmony_ci 270e41f4b71Sopenharmony_ci- DEP_BUNDLE_BASE:表示最外层Part的路径。 271e41f4b71Sopenharmony_ci 272e41f4b71Sopenharmony_ci**全局环境变量** 273e41f4b71Sopenharmony_ci 274e41f4b71Sopenharmony_ci全局环境变量由bundle.json中的envs属性来定义。整个Part中的依赖都可以获取到全局变量定义的值。 275e41f4b71Sopenharmony_ci 276e41f4b71Sopenharmony_ci 277e41f4b71Sopenharmony_ci``` 278e41f4b71Sopenharmony_ci{ 279e41f4b71Sopenharmony_ci "envs": { 280e41f4b71Sopenharmony_ci "compileEnv": "arm" 281e41f4b71Sopenharmony_ci } 282e41f4b71Sopenharmony_ci} 283e41f4b71Sopenharmony_ci``` 284e41f4b71Sopenharmony_ci 285e41f4b71Sopenharmony_ci不同Part在引入依赖的过程中可以传入不同的参数,从而使依赖的编译可以满足当前Part的需求。依赖中定义的参数可以在对应依赖脚本执行的上下文中获取到。 286e41f4b71Sopenharmony_ci 287e41f4b71Sopenharmony_ci 288e41f4b71Sopenharmony_ci``` 289e41f4b71Sopenharmony_ci{ 290e41f4b71Sopenharmony_ci "dependencies": { 291e41f4b71Sopenharmony_ci "my-bundle": { 292e41f4b71Sopenharmony_ci "version": "1.0.0", 293e41f4b71Sopenharmony_ci "mode": "debug" 294e41f4b71Sopenharmony_ci } 295e41f4b71Sopenharmony_ci } 296e41f4b71Sopenharmony_ci} 297e41f4b71Sopenharmony_ci``` 298e41f4b71Sopenharmony_ci 299e41f4b71Sopenharmony_ciPart在链接二进制文件的时候,需要知道二进制文件在依赖中的路径,所以依赖的路径会作为环境变量传入编译Part中。 300e41f4b71Sopenharmony_ci 301e41f4b71Sopenharmony_ci传入的环境变量的格式为DEP_BundleName,BundleName为依赖的名称,例如DEP_first_bundle。 302e41f4b71Sopenharmony_ci 303e41f4b71Sopenharmony_ci 304e41f4b71Sopenharmony_ci## 关于命名和版本号 305e41f4b71Sopenharmony_ci 306e41f4b71Sopenharmony_ci1. 名称需要为全小写的英文字母或数字,中间可以使用下划线分隔。如 "bundle"、 "my_bundle"、"json2"。 307e41f4b71Sopenharmony_ci 308e41f4b71Sopenharmony_ci2. 发布到[DevEco Marketplace](https://repo.harmonyos.com)的Part的名称,需要以\@开头,通过组织名用/隔离, 如\@my_org/part_name 309e41f4b71Sopenharmony_ci 310e41f4b71Sopenharmony_ci3. 组织名+Part名称,需要是唯一的,且不容易和其他作者的Part名称混淆。 311e41f4b71Sopenharmony_ci 312e41f4b71Sopenharmony_ci4. 名称应该是容易理解,而非无意义的字母组合。 313e41f4b71Sopenharmony_ci 314e41f4b71Sopenharmony_ci5. 版本号应该遵循语义化命令格式:即 "主版本号.次版本号.修订号" 或 "主版本号.次版本号.修订号-先行版本号",比如 "1.0.0", "1.0.0-beta",详细规格可以参考 [https://semver.org](https://semver.org/)。 315