# HPM Partå¼€å‘指导 ## HPM Partå¼€å‘指导概述 通常情况下,[DevEco Marketplace](https://repo.harmonyos.com)ä¸èƒ½æ‰¾åˆ°æ‚¨å¼€å‘常用的资æºï¼Œå¯ä»¥é€šè¿‡ä¾èµ–将所需的资æºå¼•å…¥å·¥ç¨‹ä¸ã€‚若现有的资æºä¸èƒ½å®Œå…¨æ»¡è¶³ï¼Œå¯ä»¥è‡ªå·±å¼€å‘并将其以HPM Partçš„æ ¼å¼å‘布。安装好hpm-cli工具åŽï¼Œå°±å¯ä»¥è¿›è¡ŒPartçš„å¼€å‘了。 >  **说明:** > 下述æ“作建议在Ubuntu 18.04åŠä»¥ä¸Šç‰ˆæœ¬è¿è¡Œã€‚ ## 安装HPM命令行工具 在进行HPM Partå¼€å‘之å‰ï¼Œé¦–先需è¦å®‰è£…包管ç†å™¨å‘½ä»¤è¡Œå·¥å…·hpm-cli。Hpm-cli是一个基于Node.jså¼€å‘的跨平å°çš„命令行工具,而è¦è¿è¡Œhpm命令,需è¦å…ˆå®‰è£…Node.js,然åŽä½¿ç”¨npmæ¥å®‰è£…hpm。 ### 安装Node.jsåŠhpm-cli 1. 安装Node.js。 从官网下载并在本地安装Node.js. 推è安装[Node.js](https://nodejs.org/)最新的LTS版本 (ä¸ä½ŽäºŽ12.x)。 2. 通过Node.js自带的npm安装hpm-cli命令行工具。执行以下命令: ``` npm install -g @ohos/hpm-cli ``` 3. 安装完æˆåŽæ‰§è¡Œå¦‚下命令,显示hpm版本,å³å®‰è£…æˆåŠŸã€‚ ``` hpm -V 或 hpm --version ``` 4. (å¯é€‰ï¼‰å¦‚果需è¦å‡çº§hpm版本,请执行如下命令: ``` npm update -g @ohos/hpm-cli ``` ### é…ç½®hpm-cli(å¯é€‰ï¼‰ 安装完hpm命令行工具åŽï¼Œå¦‚果需è¦æ›´æ”¹é…置信æ¯ï¼ˆå¦‚代ç†ï¼Œshell路径),å¯æ‰§è¡Œä»¥ä¸‹å‘½ä»¤å¯ä»¥æŸ¥çœ‹hpmé…置: ``` hpm config ``` 上述命令执行åŽå°†ä¼šæ˜¾ç¤ºhpm的默认é…置,您å¯ä»¥æ ¹æ®è‡ªå·±éœ€è¦å¯¹é»˜è®¤é…置进行修改,以下是hpm的常用é…置: ``` registry = https://hpm.harmonyos.com ### login Settings # loginUser = invitation_code #### Path Settings shellPath = C:\WINDOWS\System32\cmd.exe # shellPath = C:\Program Files\Git\bin\sh.exe # globalRepo = C:\Users\username\.hpm\global #### Network Settings # no_proxy = *.server.com # http_proxy = http://user:pwd@proxy_server:port # https_proxy = http://user:pwd@proxy_server:port # strictSsl = true #### Other Settings # privateSupport = true|false # ignoreBundles = @ohos/llvm,@ohos/gn, # OSPlatform = Auto|linux|darwin|win32 ``` ## 创建HPM Part 创建HPM Part有以下两ç§æ–¹å¼ï¼Œå¼€å‘者å¯æ ¹æ®è‡ªå·±çš„需è¦é€‰æ‹©ä½¿ç”¨ã€‚ ### 使用模æ¿åˆ›å»ºHPM Part 1. 请执行如下命令创建目录: ``` hpm init -t default mybundle ``` >  **说明:** > -tåŽçš„default表示使用å为'default'模æ¿åˆ›å»ºï¼ˆä¹Ÿå¯ä»¥æ¢ä½œå…¶ä»–的模æ¿ï¼Œå¦‚simpleã€distç‰ï¼‰ 生æˆç›®å½•ç»“构如下: ``` / ├── headers # å¤´æ–‡ä»¶ï¼ˆæ ·ä¾‹ï¼‰ │ └── main.h └── src # æºä»£ç ï¼ˆæ ·ä¾‹ï¼‰ │ └─ main.c ├── bundle.json # 元数æ®å£°æ˜Žæ–‡ä»¶ └── LICENSE # 许å¯å议文本 └── Makefile # 编译æè¿°æ–‡ä»¶ï¼ˆæ ·ä¾‹ï¼‰ └── README.md # Part的自述文件 ``` 2. 接下æ¥æ ¹æ®éœ€è¦ï¼Œå®žçŽ°Part内部的功能代ç ,以åŠç¼–译脚本。 ``` hpm init -t {templatename} -d {dir} {name} ``` >  **说明:** > - -t {templatename} :指的是模æ¿å称。 > > - -d {dir}:是è¦åˆ›å»ºçš„Part所å˜æ”¾çš„路径。 > > - name:为è¦åˆ›å»ºçš„Partå称。 hpm-cli除了æ供了少é‡é»˜è®¤æ¨¡æ¿ä¹‹å¤–,其他模æ¿å‡å˜å‚¨åœ¨[DevEco Marketplace](https://repo.harmonyos.com),å¯ä»¥ä½¿ç”¨å‘½ä»¤hpm search -t template从[DevEco Marketplace](https://repo.harmonyos.com)æœç´¢æ¨¡æ¿ã€‚  ### 将现有工程定义为Part 如果您已ç»æœ‰äº†ä»£ç 工程,需è¦åˆ†å‘çš„hpmå¹³å°ï¼Œåªéœ€è¦åœ¨å½“å‰å·¥ç¨‹ç›®å½•ä¸‹ï¼ˆä¾‹å¦‚mybundle2),执行如下命令,系统会引导您输入组件å称和版本ç‰ä¿¡æ¯ã€‚ ``` hpm init ``` 1. 输入å称åŽå›žè½¦ï¼ˆå¦‚mybundle2)。 2. 接下æ¥ä¾æ¬¡è¾“入版本ã€æè¿°ç‰ä¿¡æ¯åŽï¼Œä¼šåœ¨å½“å‰ç›®å½•ä¸‹ä¼šç”Ÿæˆä¸€ä¸ªbundle.json文件。 3. 也å¯ä»¥æ‰“å¼€bundle.json文件。 ``` $ hpm init Your bundle will be created in directory ~\demo\mybundle2 ? bundle name mybundle2 ? version 1.0.0 ... Initialization finished. ``` 4. 打开bundle.json文件修改其他信æ¯ï¼ˆå¦‚作者ã€ä»£ç 仓库ã€ä»£ç 目录ã€å‘½ä»¤è„šæœ¬ã€ä¾èµ–组件ç‰ï¼‰ï¼Œå¦‚下(仅示æ„): ``` { "name": "mybundle2", "version": "1.0.0", "publishAs": "code-segment", "dirs":{ ".":["README.md"], "src":["test.c"], "header":["header/test.h" ], "src/common":["src/common/foobar.txt"] }, "scripts": { "build": "make -${args}" }, "dependencies": { "@ohos/cjson": "^1.0.0", "@ohos/foobar": "^1.2.0" } } ``` ## 定义å‘行版 å‘行版的元数æ®æ–‡ä»¶ä¸å®šä¹‰äº†å…¶ä¾èµ–çš„Parts,以åŠå¦‚何编译ã€é“¾æŽ¥è¿™äº›Parts,生æˆé•œåƒæ–‡ä»¶çš„编译脚本。 下方以bundle.jsonä¸å®šä¹‰ä¸ºç¤ºä¾‹ï¼Œä»¥ä¸‹ç¤ºä¾‹çš„编译命令dist,采用hb编译框架æ述。 ``` { "name": "@your/dist_name", "version": "2.2.0", "publishAs": "distribution", "description": "describe it", "scripts": { "config_hb": "hb set -root $DEP_BUNDLE_BASE", "dist": "PATH=/root/.local/bin:${DEP_OHOS_gn}:${DEP_OHOS_ninja}/ninja:${DEP_OHOS_llvm}/llvm/bin:${DEP_OHOS_hc_gen}/hc-gen:${PATH} && ./scripts/dist.sh" }, "envs": { "debug": false }, "dirs": { "scripts": "scripts/*" }, "dependencies": { "@ohos/build_lite": "2.2.0", "@ohos/gn": "1.1.1", "@ohos/llvm": "1.1.1", "@ohos/hc_gen": "1.1.0", "@ohos/ninja": "1.1.0", ...... }, "ohos": { "os": "2.2-Beta", "board": "hi3516", "kernel": "liteos-a" }, "keywords": ["hispark", "hi3516"], "repository": "https://gitee.com/openharmony/your-project", "license": "Apache V2" } ``` ## 编译构建 完æˆä»£ç å¼€å‘åŽï¼Œå¦‚æžœPart的代ç 是å¯ä»¥ç‹¬ç«‹ç¼–译的,å¯ä»¥é…置编译工具和脚本以完æˆäºŒè¿›åˆ¶çš„生æˆã€‚ hpm-cli具备命令集æˆçš„能力,开å‘者å¯ä»¥é€‰æ‹©ä»»æ„的适åˆé¡¹ç›®æ‰€é‡‡ç”¨çš„è¯è¨€ç¼–译工具(如make,gcc,gnç‰ï¼‰ã€‚åªéœ€åœ¨å½“å‰é¡¹ç›®çš„bundle.json文件ä¸å®šä¹‰scripts脚本ä¸çš„build命令,就å¯ä»¥é€šè¿‡æ‰§è¡Œhpm build执行编译。 ### 定义编译脚本 以编译一个app目录下helloworldå¯æ‰§è¡Œæ–‡ä»¶ä¸ºä¾‹ï¼š ``` app ├── BUILD.gn ├── include │ └── helloworld.h └── src └── helloworld.c ``` 在helloworld.cåŒçº§ç›®å½•ä¸‹æ–°å»ºä¸€ä¸ªBUILD.gn ``` touch BUILD.gn vim BUILD.gn ``` 以下是BUILD.gnçš„æ ·ä¾‹ï¼Œä»…ä¾›å‚考 ``` executable("hello_world") { sources = [ "src/helloworld.c" ] include_dirs = [ "include" ] } ``` >  **说明:** > - “executableâ€æ˜¯gn内置模æ¿ï¼Œå¯ä»¥ç”¨â€œgn help executable â€æŸ¥çœ‹ä½¿ç”¨æ–¹æ³•ã€‚ > > - “sources â€æ˜¯æºç 路径,“include_dirs â€æ˜¯å¤´æ–‡ä»¶è·¯å¾„。 ### 执行编译 在当å‰æ–‡ä»¶å¤¹ä¸‹ï¼Œæ‰§è¡Œç¼–译命令: ``` hpm build ``` 在完æˆä¸€ç³»åˆ—的编译动作åŽï¼Œæ˜¾ç¤ºbuild succeed。检查编译的输出结果:  ### 编译image 在当å‰å‘è¡Œç‰ˆæ ¹ç›®å½•ä¸‹ï¼Œæ‰§è¡Œå¦‚ä¸‹å‘½ä»¤ã€‚ ``` hpm dist ``` hpm-cli工具会自动执行编译,生æˆé•œåƒæ–‡ä»¶ï¼Œå¦‚: ``` out |-xxdist.img |-xx.file ``` ## å‘布上架 è¦å‘布Part到hpmï¼Œä½ éœ€è¦å…ˆå…·å¤‡è´¦å·ï¼Œå¹¶åˆ›å»ºç»„织,创建组织的æ¡ä»¶åŠè¯¦ç»†æ¥éª¤è¯·å‚考[DevEco Marketplace](https://repo.harmonyos.com)上的帮助说明。 完æˆè´¦å·ç”³è¯·å’Œç»„ç»‡åˆ›å»ºï¼ˆæˆ–è€…åŠ å…¥ä¸€ä¸ªçŽ°æœ‰çš„ç»„ç»‡ï¼‰åŽï¼Œæ‚¨éœ€è¦æ ¹æ®ä¸ªäººçš„邀请ç (在[DevEco Marketplace](https://repo.harmonyos.com)的个人ä¸å¿ƒé¡µæŸ¥çœ‹ï¼‰ï¼Œåœ¨æœ¬æœºç”Ÿæˆå…¬é’¥ï¼Œå¹¶åœ¨[DevEco Marketplace](https://repo.harmonyos.com)的个人ä¸å¿ƒè¿›è¡Œé…置。 ``` hpm config set loginUser {your-invitation-code} hpm gen-keys ``` 生æˆçš„文件将会å˜æ”¾åœ¨~\Users\yourname\.hpm\key下,将公钥文件(publicKey_your-accout.pem)ä¸å†…容拷è´åˆ°hpm个人ä¸å¿ƒçš„SSH公钥ä¸ã€‚ 完æˆä¸Šè¿°æ“作åŽï¼Œä½ 就具备了在您的组织内å‘布Partçš„æƒé™äº†ã€‚ 在Part所在目录,执行命令hpm publish,将会完æˆç»„件的打包å‘布æ“作。 ``` hpm publish ``` >  **说明:** > - 为é¿å…Partå称冲çªï¼Œå‘布的Partçš„å称需é™å®šåœ¨ç»„织范围内,å³å‘½å为\@org_name/bundle_nameçš„æ ¼å¼ã€‚ > > - ä½ çš„è´¦å·ä¹Ÿå¿…须是org_name内的æˆå‘˜ï¼Œæ‰å¯ä»¥å‘布或更新组织内的Part。 > > - å‘布的组件,需è¦é€šè¿‡å®‰å…¨åŠå†…å®¹å®¡æ ¸ï¼Œæ‰èƒ½æ£å¼ç”Ÿæ•ˆã€‚ ## 使用HPM Part ### 使用Part 通常开å‘一个项目,需è¦å¼•ç”¨å…¶ä»–çš„ç»„ä»¶ä»¥åŠ å¿«ç‰¹å®šåŠŸèƒ½çš„å¼€å‘,å¯ä»¥é‡‡ç”¨å®‰è£…ä¾èµ–çš„æ–¹å¼ã€‚ 首先去[DevEco Marketplace](https://repo.harmonyos.com)ï¼Œæ ¹æ®å…³é”®å—去æœç´¢æ»¡è¶³æ‚¨çš„需求的组件,找到åˆé€‚的组件åŽï¼Œå°†å…¶å¼•å…¥åˆ°æ‚¨çš„工程。典型的æ“作æ¥éª¤åŒ…括: 1. 使用hpm init命令创建一个包æ述文件(å为bundle.json,包å«äº†ä¾èµ–和一些其他的元数æ®ï¼Œå¦‚å称ã€ç‰ˆæœ¬ç‰ï¼‰ã€‚ 2. 使用hpm install <name>命令安装ä¾èµ–(ä¾èµ–写入bundle.jsonçš„dependencieså—段)。 3. 代ç ä¸å…±å¼•ç”¨å¤´æ–‡ä»¶ï¼Œå®žçŽ°åŠŸèƒ½ã€‚ 4. 使用hpm build命令执行编译,输出编译结果。 在您的Part工程ä¸ï¼ˆå·¥ç¨‹ç›®å½•ä¸å¿…须包å«bundle.json文件)执行如下命令: ``` $ hpm install @scope/the_bundle ``` 引用的Partå°†ä¼šè¢«å®‰è£…åˆ°ä½ çš„å·¥ç¨‹æ‰€åœ¨çš„ç›®å½•çš„ohos_bundle下 ``` project ├── ohos_bundle │ └── scope │ └─ the_bundle # <---引用的组件将会出现在这 └── src │ └─ main.c ├── bundle.json # 元数æ®å£°æ˜Žæ–‡ä»¶ └── LICENSE └── Makefile └── README.md ``` 打开bundle.json文件,å¯ä»¥çœ‹åˆ°Partå·²ç»è¢«å¼•å…¥åˆ°æ‚¨çš„工程的ä¾èµ–ä¸ã€‚ ``` { "dependencies": { "@scope/the_bundle": "^1.0.0" } } ``` 您也å¯ä»¥ä¸€æ¬¡æ€§åœ¨æ¤æ–‡ä»¶ä¸ç¼–辑多个Partçš„ä¾èµ– ``` { "dependencies": { "@scope/the_bundle1": "^1.0.0", "@scope/the_bundle2": "^2.0.0", "@scope/the_bundle3": "^3.0.0", "@scope/the_bundle4": "^1.1.0" } } ``` å†æ‰§è¡Œhpm install命令,将会一次性将所有未安装的Part一次性全部下载并安装完æˆã€‚ ### 安装全局Part 如果引用的Partæ˜¯å¤šä¸ªé¡¹ç›®å…±ç”¨çš„ç»„ä»¶ï¼ˆå¦‚ç¼–è¯‘å·¥å…·é“¾ï¼‰ï¼Œä½ å¯ä»¥å…¨å±€å®‰è£… 在您的Part工程ä¸ï¼ˆå·¥ç¨‹ç›®å½•ä¸å¿…须包å«bundle.json文件)执行如下命令: ``` $ hpm install -g @scope/the_tool ``` 引用的Partå°†ä¼šè¢«å®‰è£…åˆ°ä½ åœ¨hpm configä¸è®¾ç½®çš„globalRepo所指定的目录下: ``` ~\.hpm\global\ohos_bundles │ └── scope │ └─ the_tool # <---引用的组件将会出现在这 ``` >  **说明:** > - 在项目安装的Part,在执行hpm编译命令时å¯ä»¥é€šè¿‡å¼•ç”¨çŽ¯å¢ƒå˜é‡DEP_SCOPE_bundle_name,例如: > 通过hpm i \@opensource/gn安装åŽï¼Œå¯ä»¥ç¼–辑bundle.jsonä¸çš„编译脚本,如下: > > ``` > "scripts": { > "build": "${DEP_OPENSOURCE_gn}/gn --version" > }, > ``` > > 然åŽå°±å¯ä»¥é€šè¿‡æ‰§è¡Œhpm build将调用gn的功能。 > > - 在全局安装的Part,å¯ä»¥é€šè¿‡è®¾ç½®ç³»ç»ŸçŽ¯å¢ƒå˜é‡ï¼Œç›´æŽ¥è°ƒç”¨ï¼Œæˆ–者hpm config set key valueçš„æ–¹å¼ï¼Œé€šè¿‡${key}/tool_nameçš„æ–¹å¼å¼•ç”¨ï¼Œä¾‹å¦‚: > > ``` > hpm i -g @ohos/opensource/gn > hpm config BUILD_SYS_GN ~/.hpm/global/ohos_bundles/opensource/gn > ``` > > å¯ä»¥ç¼–辑bundle.jsonä¸çš„编译脚本,如下: > > ``` > "scripts": { > "build": "${BUILD_SYS_GN}/gn --version" > }, > ``` > > 然åŽå°±å¯ä»¥é€šè¿‡æ‰§è¡Œhpm build将调用gn的功能。