提交 4ef0e3b2 编写于 作者: D duangavin123

发布HPM part

Signed-off-by: Nduangavin123 <duanxichao@huawei.com>
上级 81031741
此差异已折叠。
# Overview<a name="EN-US_TOPIC_0000001152533331"></a>
This topic provides a panorama of all documents for you to obtain helpful information quickly. These documents are classified based on your learning progress and development scenarios of OpenHarmony.
## System Types<a name="section767218232110"></a>
It is good practice to understand the system types for you to find useful documents that can guide your development.
OpenHarmony is an open-source distributed operating system for all scenarios. It uses a component-based design to tailor its features to better suit devices with 128 KiB to GiB-level of RAM. You can integrate a flexible combination of system components based on the hardware capabilities of the device.
To make the integration simple and easy on different hardware, OpenHarmony defines three basic system types. You only need to select a suitable system type and configure the mandatory component set, thereby developing a system for your device at the minimum workload. The definitions of the basic system types are provided as follows for your reference:
- Mini system
A mini system runs on the devices whose memory is greater than or equal to 128 KiB and that are equipped with MCU processors such as Arm Cortex-M and 32-bit RISC-V. This system provides multiple lightweight network protocols and graphics frameworks, and a wide range of read/write components for the IoT bus. Typical products include connection modules, sensors, and wearables for smart home.
- Small system
A small system runs on the devices whose memory is greater than or equal to 1 MiB and that are equipped with application processors such as Arm Cortex-A. This system provides higher security capabilities, standard graphics frameworks, and video encoding and decoding capabilities. Typical products include smart home IP cameras, electronic cat eyes, and routers, and event data recorders \(EDRs\) for smart travel.
- Standard system
A standard system runs on the devices whose memory is greater than or equal to 128 MiB and that are equipped with application processors such as Arm Cortex-A. This system provides a complete application framework supporting the enhanced interaction, 3D GPU, hardware composer, diverse components, and rich animations. This system applies to high-end refrigerator displays.
In addition, OpenHarmony provides a series of optional system components that can be configured as required to support feature extension and customization. These system components are combined to form a series of system capabilities that, for better understanding, are described as features or functions for you to choose.
## Document Outline<a name="section19810171681218"></a>
- [Mini and Small System Development Guidelines](#table3762949121211)
- [Standard System Development Guidelines](#table17667535516)
**Table 1** Mini and small system development guidelines \(reference memory < 128 MB\)
<a name="table3762949121211"></a>
<table><thead align="left"><tr id="row18762649161218"><th class="cellrowborder" valign="top" width="28.472847284728473%" id="mcps1.2.4.1.1"><p id="p1750131161313"><a name="p1750131161313"></a><a name="p1750131161313"></a>Topic</p>
</th>
<th class="cellrowborder" valign="top" width="35.61356135613561%" id="mcps1.2.4.1.2"><p id="p8501411141319"><a name="p8501411141319"></a><a name="p8501411141319"></a>Development Scenario</p>
</th>
<th class="cellrowborder" valign="top" width="35.91359135913591%" id="mcps1.2.4.1.3"><p id="p050181111314"><a name="p050181111314"></a><a name="p050181111314"></a>Documents</p>
</th>
</tr>
</thead>
<tbody><tr id="row317979135310"><td class="cellrowborder" valign="top" width="28.472847284728473%" headers="mcps1.2.4.1.1 "><p id="p119871717125320"><a name="p119871717125320"></a><a name="p119871717125320"></a>About <span id="text64714522207"><a name="text64714522207"></a><a name="text64714522207"></a>OpenHarmony</span></p>
</td>
<td class="cellrowborder" valign="top" width="35.61356135613561%" headers="mcps1.2.4.1.2 "><p id="p14987151715312"><a name="p14987151715312"></a><a name="p14987151715312"></a>Getting familiar with <span id="text9808161615252"><a name="text9808161615252"></a><a name="text9808161615252"></a>OpenHarmony</span></p>
</td>
<td class="cellrowborder" valign="top" width="35.91359135913591%" headers="mcps1.2.4.1.3 "><a name="ul59871171533"></a><a name="ul59871171533"></a><ul id="ul59871171533"><li><a href="https://gitee.com/openharmony" target="_blank" rel="noopener noreferrer">About OpenHarmony</a></li><li><a href="glossary/glossary.md">Glossary</a></li></ul>
</td>
</tr>
<tr id="row69521557115217"><td class="cellrowborder" valign="top" width="28.472847284728473%" headers="mcps1.2.4.1.1 "><p id="p69873174536"><a name="p69873174536"></a><a name="p69873174536"></a>Development resources</p>
</td>
<td class="cellrowborder" valign="top" width="35.61356135613561%" headers="mcps1.2.4.1.2 "><p id="p39871917185313"><a name="p39871917185313"></a><a name="p39871917185313"></a>Preparing for your development</p>
</td>
<td class="cellrowborder" valign="top" width="35.91359135913591%" headers="mcps1.2.4.1.3 "><a name="ul59871117135314"></a><a name="ul59871117135314"></a><ul id="ul59871117135314"><li><a href="get-code/sourcecode-acquire.md">Obtaining Source Code</a></li><li><a href="get-code/gettools.md">Tool Acquisition</a></li></ul>
</td>
</tr>
<tr id="row11602937131510"><td class="cellrowborder" valign="top" width="28.472847284728473%" headers="mcps1.2.4.1.1 "><p id="p457713717150"><a name="p457713717150"></a><a name="p457713717150"></a>Quick start</p>
</td>
<td class="cellrowborder" valign="top" width="35.61356135613561%" headers="mcps1.2.4.1.2 "><p id="p55771237111517"><a name="p55771237111517"></a><a name="p55771237111517"></a>Getting started with setup, build, burning, debugging, and running of <span id="text203751321355"><a name="text203751321355"></a><a name="text203751321355"></a>OpenHarmony</span></p>
</td>
<td class="cellrowborder" valign="top" width="35.91359135913591%" headers="mcps1.2.4.1.3 "><p id="p10832159115410"><a name="p10832159115410"></a><a name="p10832159115410"></a><a href="quick-start/quickstart-lite.md">Mini and Small Systems</a></p>
</td>
</tr>
<tr id="row11602103701514"><td class="cellrowborder" valign="top" width="28.472847284728473%" headers="mcps1.2.4.1.1 "><p id="p16577163716159"><a name="p16577163716159"></a><a name="p16577163716159"></a>Basic capabilities</p>
</td>
<td class="cellrowborder" valign="top" width="35.61356135613561%" headers="mcps1.2.4.1.2 "><p id="p857711379158"><a name="p857711379158"></a><a name="p857711379158"></a>Using basic capabilities of <span id="text8928941123820"><a name="text8928941123820"></a><a name="text8928941123820"></a>OpenHarmony</span></p>
</td>
<td class="cellrowborder" valign="top" width="35.91359135913591%" headers="mcps1.2.4.1.3 "><a name="ul1577103716159"></a><a name="ul1577103716159"></a><ul id="ul1577103716159"><li><a href="kernel/kernel-mini.md">Kernel for Mini Systems</a></li><li><a href="kernel/kernel-small.md">Kernel for Small Systems</a></li><li><a href="driver/Readme-EN.md">Drivers</a></li><li><a href="subsystems/Readme-EN.md">Subsystems</a></li><li><a href="security/security-guidelines-overall.md">Security Guidelines</a></li><li><a href="security/security-privacy-protection.md">Privacy Protection</a></li></ul>
</td>
</tr>
<tr id="row10602193719152"><td class="cellrowborder" valign="top" width="28.472847284728473%" headers="mcps1.2.4.1.1 "><p id="p857873713152"><a name="p857873713152"></a><a name="p857873713152"></a>Advanced development</p>
</td>
<td class="cellrowborder" valign="top" width="35.61356135613561%" headers="mcps1.2.4.1.2 "><p id="p155782037201518"><a name="p155782037201518"></a><a name="p155782037201518"></a>Developing smart devices based on system capabilities</p>
</td>
<td class="cellrowborder" valign="top" width="35.91359135913591%" headers="mcps1.2.4.1.3 "><a name="ul257883731519"></a><a name="ul257883731519"></a><ul id="ul257883731519"><li><a href="guide/device-wlan.md">WLAN-connected Products</a></li><li><a href="guide/device-iotcamera-control.md">Cameras Without a Screen</a></li><li><a href="guide/device-camera.md">Cameras with a Screen</a></li></ul>
</td>
</tr>
<tr id="row360273716155"><td class="cellrowborder" valign="top" width="28.472847284728473%" headers="mcps1.2.4.1.1 "><p id="p12579163711513"><a name="p12579163711513"></a><a name="p12579163711513"></a>Porting and adaptation</p>
</td>
<td class="cellrowborder" valign="top" width="35.61356135613561%" headers="mcps1.2.4.1.2 "><a name="ul12579137121512"></a><a name="ul12579137121512"></a><ul id="ul12579137121512"><li>Porting and adapting the <span id="text1415622205014"><a name="text1415622205014"></a><a name="text1415622205014"></a>OpenHarmony</span> to an SoC</li><li>Porting and adapting the <span id="text82061719165013"><a name="text82061719165013"></a><a name="text82061719165013"></a>OpenHarmony</span> to a third-party library</li></ul>
</td>
<td class="cellrowborder" valign="top" width="35.91359135913591%" headers="mcps1.2.4.1.3 "><a name="ul157903731520"></a><a name="ul157903731520"></a><ul id="ul157903731520"><li><a href="porting/porting-minichip.md">Mini System SoC Porting Guide</a></li><li><a href="porting/porting-smallchip.md">Small System SoC Porting Guide</a></li><li><a href="porting/porting-thirdparty.md">Third-Party Library Porting Guide for Mini and Small Systems</a></li></ul>
</td>
</tr>
<tr id="row9601737181517"><td class="cellrowborder" valign="top" width="28.472847284728473%" headers="mcps1.2.4.1.1 "><p id="p25791037131519"><a name="p25791037131519"></a><a name="p25791037131519"></a>Contributing components</p>
</td>
<td class="cellrowborder" valign="top" width="35.61356135613561%" headers="mcps1.2.4.1.2 "><p id="p45798376158"><a name="p45798376158"></a><a name="p45798376158"></a>Contributing components to <span id="text207913212498"><a name="text207913212498"></a><a name="text207913212498"></a>OpenHarmony</span></p>
</td>
<td class="cellrowborder" valign="top" width="35.91359135913591%" headers="mcps1.2.4.1.3 "><a name="ul957919379156"></a><a name="ul957919379156"></a><ul id="ul957919379156"><li><a href="bundles/bundles-standard-rules.md">HPM Bundle Development Specifications</a></li><li><a href="bundles/bundles-guide.md">HPM Bundle Development Guidelines</a></li><li><a href="bundles/bundles-demo.md">HPM Bundle Development Example</a></li></ul>
</td>
</tr>
<tr id="row260193701512"><td class="cellrowborder" valign="top" width="28.472847284728473%" headers="mcps1.2.4.1.1 "><p id="p95794372155"><a name="p95794372155"></a><a name="p95794372155"></a>Reference</p>
</td>
<td class="cellrowborder" valign="top" width="35.61356135613561%" headers="mcps1.2.4.1.2 "><p id="p458073721519"><a name="p458073721519"></a><a name="p458073721519"></a>Referring to development specifications</p>
</td>
<td class="cellrowborder" valign="top" width="35.91359135913591%" headers="mcps1.2.4.1.3 "><a name="ul175808372155"></a><a name="ul175808372155"></a><ul id="ul175808372155"><li><a href="https://device.harmonyos.com/en/docs/apiref/js-framework-file-0000000000616658" target="_blank" rel="noopener noreferrer">API References</a></li><li><a href="faqs/Readme-EN.md" target="_blank" rel="noopener noreferrer">FAQs</a></li></ul>
</td>
</tr>
</tbody>
</table>
**Table 2** Standard system development guidelines \(reference memory ≥ 128 MB\)
<a name="table17667535516"></a>
<table><thead align="left"><tr id="row206665375119"><th class="cellrowborder" valign="top" width="27.872787278727873%" id="mcps1.2.4.1.1"><p id="p4661053145115"><a name="p4661053145115"></a><a name="p4661053145115"></a>Topic</p>
</th>
<th class="cellrowborder" valign="top" width="36.053605360536054%" id="mcps1.2.4.1.2"><p id="p126685315112"><a name="p126685315112"></a><a name="p126685315112"></a>Development Scenario</p>
</th>
<th class="cellrowborder" valign="top" width="36.07360736073608%" id="mcps1.2.4.1.3"><p id="p26695395112"><a name="p26695395112"></a><a name="p26695395112"></a>Documents</p>
</th>
</tr>
</thead>
<tbody><tr id="row9662532514"><td class="cellrowborder" valign="top" width="27.872787278727873%" headers="mcps1.2.4.1.1 "><p id="p066105317513"><a name="p066105317513"></a><a name="p066105317513"></a>About <span id="text70243343"><a name="text70243343"></a><a name="text70243343"></a>OpenHarmony</span></p>
</td>
<td class="cellrowborder" valign="top" width="36.053605360536054%" headers="mcps1.2.4.1.2 "><p id="p16673531512"><a name="p16673531512"></a><a name="p16673531512"></a>Getting familiar with <span id="text897788591"><a name="text897788591"></a><a name="text897788591"></a>OpenHarmony</span></p>
</td>
<td class="cellrowborder" valign="top" width="36.07360736073608%" headers="mcps1.2.4.1.3 "><a name="ul10673531517"></a><a name="ul10673531517"></a><ul id="ul10673531517"><li><a href="https://gitee.com/openharmony/docs/blob/master/en/OpenHarmony-Overview.md" target="_blank" rel="noopener noreferrer">About OpenHarmony</a></li><li><a href="glossary/glossary.md">Glossary</a></li></ul>
</td>
</tr>
<tr id="row267155313513"><td class="cellrowborder" valign="top" width="27.872787278727873%" headers="mcps1.2.4.1.1 "><p id="p13671853205113"><a name="p13671853205113"></a><a name="p13671853205113"></a>Development resources</p>
</td>
<td class="cellrowborder" valign="top" width="36.053605360536054%" headers="mcps1.2.4.1.2 "><p id="p0671053115115"><a name="p0671053115115"></a><a name="p0671053115115"></a>Preparing for your development</p>
</td>
<td class="cellrowborder" valign="top" width="36.07360736073608%" headers="mcps1.2.4.1.3 "><a name="ul06732078273"></a><a name="ul06732078273"></a><ul id="ul06732078273"><li><a href="get-code/sourcecode-acquire.md">Obtaining Source Code</a></li><li><a href="get-code/gettools.md">Tool Acquisition</a></li></ul>
</td>
</tr>
<tr id="row13671253165120"><td class="cellrowborder" valign="top" width="27.872787278727873%" headers="mcps1.2.4.1.1 "><p id="p166795345112"><a name="p166795345112"></a><a name="p166795345112"></a>Quick start</p>
</td>
<td class="cellrowborder" valign="top" width="36.053605360536054%" headers="mcps1.2.4.1.2 "><p id="p1167135345112"><a name="p1167135345112"></a><a name="p1167135345112"></a>Getting started with setup, build, burning, debugging, and running of <span id="text687119202170"><a name="text687119202170"></a><a name="text687119202170"></a>OpenHarmony</span></p>
</td>
<td class="cellrowborder" valign="top" width="36.07360736073608%" headers="mcps1.2.4.1.3 "><p id="p1114162510521"><a name="p1114162510521"></a><a name="p1114162510521"></a><a href="quick-start/quickstart-standard.md">Standard System</a></p>
</td>
</tr>
<tr id="row1168155365119"><td class="cellrowborder" valign="top" width="27.872787278727873%" headers="mcps1.2.4.1.1 "><p id="p96810536514"><a name="p96810536514"></a><a name="p96810536514"></a>Basic capabilities</p>
</td>
<td class="cellrowborder" valign="top" width="36.053605360536054%" headers="mcps1.2.4.1.2 "><p id="p136812535511"><a name="p136812535511"></a><a name="p136812535511"></a>Using basic capabilities of <span id="text1468659507"><a name="text1468659507"></a><a name="text1468659507"></a>OpenHarmony</span></p>
</td>
<td class="cellrowborder" valign="top" width="36.07360736073608%" headers="mcps1.2.4.1.3 "><a name="ul1954915235272"></a><a name="ul1954915235272"></a><ul id="ul1954915235272"><li><a href="kernel/kernel-standard.md">Kernel for Standard Systems</a></li><li><a href="driver/Readme-EN.md">Drivers</a></li><li><a href="subsystems/Readme-EN.md">Subsystems</a></li><li><a href="security/security-guidelines-overall.md">Security Guidelines</a></li><li><a href="security/security-privacy-protection.md">Privacy Protection</a></li></ul>
</td>
</tr>
<tr id="row10602193719152"><td class="cellrowborder" valign="top" width="28.472847284728473%" headers="mcps1.2.4.1.1 "><p id="p857873713152"><a name="p857873713152"></a><a name="p857873713152"></a>Advanced development</p>
</td>
<td class="cellrowborder" valign="top" width="35.61356135613561%" headers="mcps1.2.4.1.2 "><p id="p155782037201518"><a name="p155782037201518"></a><a name="p155782037201518"></a>Developing smart devices based on system capabilities</p>
</td>
<td class="cellrowborder" valign="top" width="35.91359135913591%" headers="mcps1.2.4.1.3 "><a name="ul257883731519"></a><a name="ul257883731519"></a><ul id="ul257883731519"><li><a href="guide/device-clock-guide.md">Development Guidelines on Clock Apps</a></li><li><a href="guide/device-driver-demo.md">Development Example for Platform Drivers</a></li><li><a href="guide/device-outerdriver-demo.md">Development Example for Peripheral Drivers</a></li></ul>
</td>
</tr>
<tr id="row66915375119"><td class="cellrowborder" valign="top" width="27.872787278727873%" headers="mcps1.2.4.1.1 "><p id="p4696535512"><a name="p4696535512"></a><a name="p4696535512"></a>Porting and adaptation</p>
</td>
<td class="cellrowborder" valign="top" width="36.053605360536054%" headers="mcps1.2.4.1.2 "><p id="p185185615284"><a name="p185185615284"></a><a name="p185185615284"></a>Porting and adapting the <span id="text1434016533511"><a name="text1434016533511"></a><a name="text1434016533511"></a>OpenHarmony</span> to a third-party library</p>
</td>
<td class="cellrowborder" valign="top" width="36.07360736073608%" headers="mcps1.2.4.1.3 "><a name="ul14724164204819"></a><a name="ul14724164204819"></a><ul id="ul14724164204819"><li><a href="porting/standard-system-porting-guide.md">Standard System Porting Guide</a></li><li><a href="porting/porting-linux-kernel.md">A Method for Rapidly Porting the OpenHarmony Linux Kernel </a></li></ul>
</td>
</tr>
<tr id="row869853125119"><td class="cellrowborder" valign="top" width="27.872787278727873%" headers="mcps1.2.4.1.1 "><p id="p3691530511"><a name="p3691530511"></a><a name="p3691530511"></a>Contributing components</p>
</td>
<td class="cellrowborder" valign="top" width="36.053605360536054%" headers="mcps1.2.4.1.2 "><p id="p1469115335113"><a name="p1469115335113"></a><a name="p1469115335113"></a>Contributing components to <span id="text1180831622"><a name="text1180831622"></a><a name="text1180831622"></a>OpenHarmony</span></p>
</td>
<td class="cellrowborder" valign="top" width="36.07360736073608%" headers="mcps1.2.4.1.3 "><a name="ul44949625110"></a><a name="ul44949625110"></a><ul id="ul44949625110"><li><a href="bundles/bundles-standard-rules.md">HPM Bundle Development Specifications</a></li><li><a href="bundles/bundles-guide.md">HPM Bundle Development Guidelines</a></li><li><a href="bundles/bundles-demo.md">HPM Bundle Development Example</a></li></ul>
</td>
</tr>
<tr id="row1170153125110"><td class="cellrowborder" valign="top" width="27.872787278727873%" headers="mcps1.2.4.1.1 "><p id="p16701253195118"><a name="p16701253195118"></a><a name="p16701253195118"></a>Reference</p>
</td>
<td class="cellrowborder" valign="top" width="36.053605360536054%" headers="mcps1.2.4.1.2 "><p id="p670135335116"><a name="p670135335116"></a><a name="p670135335116"></a>Referring to development specifications</p>
</td>
<td class="cellrowborder" valign="top" width="36.07360736073608%" headers="mcps1.2.4.1.3 "><a name="ul177016538519"></a><a name="ul177016538519"></a><ul id="ul177016538519"><li><a href="https://device.harmonyos.com/en/docs/apiref/js-framework-file-0000000000616658" target="_blank" rel="noopener noreferrer">API References</a></li><li><a href="faqs/Readme-EN.md" target="_blank" rel="noopener noreferrer">FAQs</a></li></ul>
</td>
</tr>
</tbody>
</table>
# Bundle开发指南
- [开发规范](bundles-standard-rules.md )
- [开发指南](bundles-guide.md)
- [概述](bundles-guide-overview.md)
- [安装hpm命令行工具](bundles-guide-prepare.md)
- [开发Bundle](bundles-guide-develop.md)
- [开发示例](bundles-demo.md)
- [HPM介绍](bundles-demo-hpmdescription.md)
- [编译环境准备](bundles-demo-environment.md)
- [操作实例](bundles-demo-devsample.md)
# bundles
- [HPM Part介绍](hpm-part-about.md)
- [HPM Part开发指导](hpm-part-development.md)
- [HPM Part参考](hpm-part-reference.md)
# 操作实例<a name="ZH-CN_TOPIC_0000001072143838"></a>
环境准备好后,接下来本文以Hi3861平台为例,演示如何利用hpm进行发行版的安装、编译。
1. 执行以下命令,创建目录,并根据模板dist创建一个默认工程(目录名可自行设置):
```
mkdir test3861
cd test3861
hpm init -t dist myproduct
```
创建成功则显示:
```
Initialization finished.
```
2. 安装hispark\_pegasus发行版。
```
hpm install @ohos/hispark_pegasus
```
安装成功则显示:
```
Installed.
```
>![](../public_sys-resources/icon-note.gif) **说明:**
>Hi3516平台采用下述命令:
>```
>hpm install @ohos/hispark_taurus
>```
>Hi3518平台采用下述命令:
>```
>hpm install @ohos/hispark_aries
>```
3. 编译打包
```
hpm dist
```
编译成功会显示:
```
{{name}}: distribution building completed.
```
4. 上述所有命令执行成功后,在 ./out 目录下会生成编译结果,开发者可以将编译结果烧录到对应的开发板上进行测试。
# 编译环境准备<a name="ZH-CN_TOPIC_0000001071315859"></a>
- [linux服务器](#section20979554791)
- [安装Node.js](#section9954105413153)
- [安装HPM命令行工具](#section15937194904819)
- [安装python环境](#section1621819180417)
- [安装文件打包工具](#section77617165913)
- [安装SCons](#section873135716233)
![](figure/3516dv300.png)
## linux服务器<a name="section20979554791"></a>
准备一台装有Ubuntu 16.04 及以上 64 位系统的linux服务器(当前未完全支持window环境下的编译)。
将linux shell改为bash:
```
ls -l $(which sh)
# 如果指向的不是bash,则按以下方式修改:
# 方法一:执行以下命令,然后选择no
dpkg-reconfigure dash
# 方法二:先删除sh,再重新创建软连接
rm -f /bin/sh
ln -s bash /bin/sh
```
## 安装Node.js<a name="section9954105413153"></a>
推荐安装 Node.js 12.x (包含 npm 6.14.4)或更高版本(推荐 12.13.0+):
```
sudo apt-get install nodejs
sudo apt-get install npm
```
查看版本:
```
node --version # 查看nodejs版本
npm --version # 查看npm版本
```
## 安装HPM命令行工具<a name="section15937194904819"></a>
通过 Node.js 自带的 npm(使用默认的源 https://registry.npmjs.org/ )安装 hpm-cli 命令行工具:
```
npm install -g @ohos/hpm-cli
```
安装完hpm-cli命令行工具后,执行以下命令可以查看hpm配置:
```
hpm config
```
上述命令执行后将会显示hpm的默认配置,您可以根据实际情况对默认配置进行修改,以下是hpm的常用配置:
```
registry = https://hpm.harmonyos.com # hpm注册中心地址,下载组件必须
strictSsl = true # 通过https连接时,是否需要校验证书
http_proxy = http://your-proxy-server:port # 配置HTTP代理
https_proxy = http://your-proxy-server:port # 配置HTTPS代理
```
hpm-cli的命令介绍可以参考:[hpm操作命令](oem_bundle_standard_des.md)
## 安装python环境<a name="section1621819180417"></a>
需使用python3.7以上版本,采用以下命令进行安装:
```
sudo apt-get install python3.8
sudo apt-get install python3-pip
sudo pip3 install setuptools
sudo pip3 install kconfiglib # 建议安装kconfiglib 13.2.0+版本
```
>![](../public_sys-resources/icon-note.gif) **说明:**
>上述方式适用Hi3518和Hi3516两种平台,针对Hi3861平台采用以下方式安装python环境:
>```
>sudo apt-get install python3.8
>sudo apt-get install python3-pip
>sudo pip3 install setuptools
>sudo pip3 install kconfiglib # 建议安装kconfiglib 13.2.0+版本
>sudo pip3 install pycryptodome
>sudo pip3 install six --upgrade --ignore-installed six
>sudo pip3 install ecdsa
>```
如果当前系统中既存在python2又存在python3,参考以下方法将默认python修改为python3:
```
ll `which python`
rm /usr/bin/python
ln -s python3.8 /usr/bin/python
```
## 安装文件打包工具<a name="section77617165913"></a>
采用以下命令进行安装:
```
which mkfs.vfat # 如果没找到,执行以下命令安装
sudo apt-get install dosfstools
which mcopy # 如果没找到,执行以下命令安装
sudo apt-get install mtools
```
>![](../public_sys-resources/icon-note.gif) **说明:**
>Hi3518和Hi3516两种平台需要安装打包工具,Hi3861平台不需要。
## 安装SCons<a name="section873135716233"></a>
1. 打开Linux编译服务器终端。
2. 运行如下命令,安装SCons安装包。
```
python3 -m pip install scons
```
3. 运行如下命令,查看是否安装成功。如果安装成功,查询结果下图所示。
```
scons -v
```
**图 1** SCons安装成功界面,版本要求3.0.4以上<a name="fig235815252492"></a>
![](figure/SCons安装成功界面-版本要求3-0-4以上-27.png "SCons安装成功界面-版本要求3-0-4以上-27")
>![](../public_sys-resources/icon-note.gif) **说明:**
>Hi3861平台需要安装SCons,Hi3518和Hi3516两种平台不需要。
# HPM介绍<a name="ZH-CN_TOPIC_0000001071487274"></a>
HPM全称HarmonyOS Package Manager,是OpenHarmonyBundle的管理和分发工具。HPM主要是面向OpenHarmony开发者,用于获取/定制OpenHarmony源码,执行安装依赖、编译、打包、升级等操作的工具集。本文档将向开发者介绍如何使用HPM工具进行OpenHarmonyBundle的安装、编译、打包等操作。
# 开发示例<a name="ZH-CN_TOPIC_0000001157479397"></a>
- **[HPM介绍](bundles-demo-hpmdescription.md)**
- **[编译环境准备](bundles-demo-environment.md)**
- **[操作实例](bundles-demo-devsample.md)**
# 开发Bundle<a name="ZH-CN_TOPIC_0000001051690861"></a>
- [创建Bundle](#section717481119145)
- [将现有工程定义为Bundle](#section102861955201410)
- [发布Bundle到HPM平台](#section1318574233211)
- [引用Bundle](#section57959284315)
- [全局安装Bundle](#section647375516313)
- [编译Bundle](#section7972161715325)
- [定义编译脚本](#section10274147111610)
- [执行编译](#section879301916172)
- [定义发行版](#section127388393326)
- [定义脚本](#section11503171219190)
- [编译发行版](#section4694125521912)
- [烧录](#section2061514431039)
创建OpenHarmonyBundle有如下几种方式:
- 从头创建一个全新的Bundle。
- 将一个现有的源码项目定义为Bundle。
## 创建Bundle<a name="section717481119145"></a>
通常情况下,[HPM网站](https://hpm.harmonyOS.com)上能找到您开发常用的Bundle,如果现有的Bundle不能完全满足开发,这时可以自己动手开发一个Bundle。
如果您愿意,可以将Bundle发布到HPM的仓库中供其他用户使用。
假设要在D:/source目录下新建一个全新的Bundle:my-bundle,可以使用hpm init 创建该Bundle的脚手架代码,例如,进入D:/source目录,执行如下命令:
```
hpm init -t default -d demo mybundle
```
将使用'default' 模板 在当前目录下的demo路径下,创建一个名为mybundle的Bundle:
```
demo
├── headers # 头文件(样例)
│ └── main.h
└── src # 源代码(样例)
│ └─ main.c
├── bundle.json # 元数据声明文件
└── LICENSE # 许可协议文本
└── Makefile # 编译描述文件(样例)
└── README.md # Bundle的自述文件
```
接下来根据您的业务需要,实现Bundle内部的功能代码,以及编译脚本,完成代码开发后,通过git将代码(包括bundle.json文件)提交到组件代码托管仓库中(如gitee)。
>![](../public_sys-resources/icon-note.gif) **说明:**
>```
>hpm init -t {templatename} -d {dir} {name}
>```
>- -t \{templatename\} :指的是模板名称。
>- -d \{dir\}:是要创建的Bundle所存放的路径。
>- name:为要创建的Bundle名称。
hpm 除了提供了少量默认模板之外,其他模板均存储在服务器端,可以使用命令hpm search -t template 从服务器端搜索模板。
![](figure/zh-cn_image_0000001141641532.png)
## 将现有工程定义为Bundle<a name="section102861955201410"></a>
如果您已经有了代码工程,需要分发的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 mybundel2
? version 1.0.0
...
Initialization finished.
```
1. 打开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"
}
}
```
## 发布Bundle到HPM平台<a name="section1318574233211"></a>
要在发布Bundle到HPM,你需要先具备账号,并创建组织,创建组织的条件及详细步骤请参考hpm网站上的帮助说明。
完成账号申请和组织创建(或者加入一个现有的组织)后,您需要根据个人的邀请码(在HPM网站的个人中心页查看),在本机生成公钥,并在HPM网站的个人中心配置。
```
hpm config set loginUser {your-invitation-code}
hpm gen-keys
```
生成的文件将会存放在 \~\\Users\\yourname\\.hpm\\key 下,将公钥文件\(publicKey\_your-accout.pem\)中内容拷贝到 HPM 个人中心的 SSH 公钥中。
完成上述操作后,你就具备了在您的组织内发布Bundle的权限了。
在bundle所在目录,执行命令hpm publish,将会完成组件的打包发布操作。
```
hpm publish
```
>![](../public_sys-resources/icon-note.gif) **说明:**
>- 为避免Bundle名称冲突,发布的Bundle的名称需限定在组织范围内,即命名为@org\_name/bundle\_name的格式。
>- 你的账号也必须是org\_name内的成员,才可以发布或更新组织内的Bundle。
>- 发布的组件,需要通过安全及内容审核,才能正式生效。
## 引用Bundle<a name="section57959284315"></a>
通常开发一个项目,需要引用其他的组件以加快特定功能的开发,可以采用安装依赖的方式。
首先去HPM网站,根据关键字去搜索满足您的需求的组件,找到合适的组件后,将其引入到您的工程。
在您的bundle工程中(工程目录中必须包含bundle.json文件)执行如下命令:
```
$ hpm install @scope/the_bundle
```
引用的bundle将会被安装到你的工程所在的目录的 ohos\_bundle下
```
project
├── ohos_bundle
│ └── scope
│ └─ the_bundle # <---引用的组件将会出现在这
└── src
│ └─ main.c
├── bundle.json # 元数据声明文件
└── LICENSE
└── Makefile
└── README.md
```
打开bundle.json文件,可以看到bundle已经被引入到您的工程的依赖中。
```
{
"dependencies": {
"@scope/the_bundle": "^1.0.0"
}
}
```
您也可以一次性在此文件中编辑多个Bundle的依赖
```
{
"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命令,将会一次性将所有未安装的Bundle一次性全部下载并安装完成。
## 全局安装Bundle<a name="section647375516313"></a>
如果引用的Bundle是多个项目共用的组件(如编译工具链),你可以全局安装
在您的bundle工程中(工程目录中必须包含bundle.json文件)执行如下命令:
```
$ hpm install -g @scope/the_tool
```
引用的bundle将会被安装到你在hpm config中设置的globalRepo所指定的目录下:
```
~\.hpm\global
│ └── scope
│ └─ the_tool # <---引用的组件将会出现在这
```
>![](../public_sys-resources/icon-note.gif) **说明:**
>- 在项目安装的Bundle,在执行hpm编译命令时可以通过引用环境变量 DEP\_SCOPE\_bundle\_name,例如:
>通过 hpm i @opensource/gn 安装后,可以编辑bundle.json中的编译脚本,如下:
>```
>"scripts": {
> "build": "${DEP_OPENSOURCE_gn}/gn --version"
> },
>```
>然后就可以通过执行hpm build将调用gn的功能。
>- 在全局安装的Bundle,可以通过设置系统环境变量,直接调用,或者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的功能。
## 编译Bundle<a name="section7972161715325"></a>
完成代码开发后,如果Bundle的代码是可以独立编译的,可以配置编译工具和脚本以完成二进制的生成。
hpm具备命令集成的能力,您可以选择任意的适合项目所采用的语言编译工具(如make,gcc,gn等等)。只需在当前项目的bundle.json文件中定义scripts脚本中的build命令,就可以通过执行hpm build执行编译。
## 定义编译脚本<a name="section10274147111610"></a>
以编译一个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"
]
}
```
>![](../public_sys-resources/icon-note.gif) **说明:**
>- “executable”是gn内置模板,可以用“gn help executable ”查看使用方法。
>- “sources ”是源码路径,“include\_dirs ”是头文件路径。
## 执行编译<a name="section879301916172"></a>
在当前文件夹下,执行编译命令:
```
hpm build
```
在完成一系列的编译动作后,显示build succeed。检查编译的输出结果:
![](figure/zh-cn_image_0000001188041297.png)
## 定义发行版<a name="section127388393326"></a>
发行版的元数据文件中定义了其依赖的Bundles,以及如何编译、链接这些bundles,生成镜像文件。
示例如下(以下示例的编译命令dist,采用hb编译框架描述)
## 定义脚本<a name="section11503171219190"></a>
bundle.json中定义如下(示例)
```
{
"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"
}
```
## 编译发行版<a name="section4694125521912"></a>
在当前发行版根目录下,执行如下命令。
```
hpm dist
```
hpm-cli工具会自动执行编译,生成镜像文件,如:
```
out
|-xxdist.img
|-xx.file
```
## 烧录<a name="section2061514431039"></a>
发行版的编译结果可以烧录到设备中运行,例如使用hiburn工具进行烧录。在发行版的bundle.json文件配置烧录参数。
```
"scripts": {
"flash": "{$DEP_HIBURN}/hiburn"
},
```
设置烧录命令行工具的所在路径,配置烧录相关的参数(参考烧录工具的说明进行配置)。
```
hpm config set DEP_HIBURN {hiburn_path}
hpm run flash
```
>![](../public_sys-resources/icon-note.gif) **说明:**
>上述仅描述如何定义bundle.json的样例,烧录工具取决于实际开发板所需的工具。
# 概述<a name="ZH-CN_TOPIC_0000001051452100"></a>
- [Bundle](#section196713235514)
- [Distribution](#section155387501033)
本章节将介绍OpenHarmony中的Bundle相关概念以及如何定义Bundle,并以一个示例说明如何使用hpm命令行工具完成Bundle的创建、开发、编译、发布、安装使用的全过程。
## Bundle<a name="section196713235514"></a>
Bundle是OpenHarmony中一个用来表示分发单元的术语,等同于包,一个Bundle中通常包含以下内容:
- 被分发的二进制文件(二进制类型)
- 被分发的源代码文件(源代码/代码片段类型)
- 编译脚本(发行版类型需要)
- 自身的说明文件
- bundle.json:元数据声明(名称,版本,依赖等)
- LICENSE:许可协议文本
- README.md:自述文件
- CHANGELOG.md:变更日志(可选)
>![](../public_sys-resources/icon-note.gif) **说明:**
>Bundle的类型可以分为二进制,源代码,代码片段,模板,插件,发行版等。一个Bundle可以依赖其他的Bundles,依赖关系为有向无环图
一个Bundle被发布到HPM服务器(https://hpm.harmonyos.com)后,另外一些开发者就可以通过hpm包管理器下载安装使用 。
一个Bundle在命名空间内拥有唯一的名称(命名格式为:@scope/name),可以进行独立的版本演进。
## Distribution<a name="section155387501033"></a>
Distribution是OpenHarmony的发行版,是一个完整的操作系统版本,集合了各种Bundle(驱动,内核,框架,应用等),也通过Bundle在HPM平台分发。
>![](../public_sys-resources/icon-note.gif) **说明:**
>发行版的元数据中仅描述了依赖的Bundles以及如何编译该发行版的编译脚本,并不包含发行版的二进制镜像。下载发行版后,需要在本地将依赖的Bundles下载下来,安装编译后才能得到可用于烧录的系统镜像文件。
>发行版可以继承,即在一个既有的发行版的基础上,通过增加/删除Bundle形成新的发行版,以实现发行版的定制。
**图 1** 组Bundle和Distribution的关系<a name="fig85033524124"></a>
![](figure/组件和发行版的构成-英文.png)
# 安装hpm命令行工具<a name="ZH-CN_TOPIC_0000001051770836"></a>
- [安装](#section14480912380)
- [配置hpm(可选)](#section138983413013)
- [下载OpenHarmony代码](#section669905815300)
要进行Bundle的开发,需要安装包管理器hpm(HarmonyOS Package Manager),这是一个基于Node.js开发的跨平台的命令行工具,所以要运行hpm,需要先安装Node.js,然后可以npm 来安装hpm。
## 安装<a name="section14480912380"></a>
1. 安装Node.js。
从官网下载并在本地安装Node.js.
推荐安装 [Node.js](https://nodejs.org/) 12.x \(包含 npm 6.14.4\)或更高版本 \(推荐 12.13.0+\)。
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(可选)<a name="section138983413013"></a>
安装完hpm-cli命令行工具后,如果需要更改配置信息(如代理,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-cli的命令介绍可以参考:[hpm操作命令](bundles-guide-overview.md)
## 下载OpenHarmony代码<a name="section669905815300"></a>
参考[《源码获取》](../get-code/sourcecode-acquire.md)
# 开发指南<a name="ZH-CN_TOPIC_0000001157319417"></a>
- **[概述](bundles-guide-overview.md)**
- **[安装hpm命令行工具](bundles-guide-prepare.md)**
- **[开发Bundle](bundles-guide-develop.md)**
# HPM bundle<a name="ZH-CN_TOPIC_0000001111039520"></a>
- **[开发规范](oem_bundle_standard_des.md)**
- **[开发指南](bundles-guide.md)**
- **[开发示例](bundles-demo.md)**
# HPM Part介绍
本章节将介绍OpenHarmony中的HPM Part相关概念,开发者可熟悉以下内容帮助进行HPM Part开发。
## Part介绍
### Part分类
Part是一个用于表示OpenHarmony分发单元的术语。大致分为两大类:
- **部件级Part**:用于描述模块、部件级别的Part,强调可复用性,分发的内容可以是源代码或二进制文件,通常部件级Part和一个代码仓对应,是代码仓的发布件。
- **发行版级Part**:用于描述某一款操作系统发行版的Part,是由一组依赖的Part清单及如何编译构建该发行版的脚本构成,发行版中包含了一个完整操作系统的各类部件(如驱动、内核、框架、应用),编译后生成的镜像可以用于设备的烧录。
### Part构成
一个Part中包含包说明和包内容两部分:
包说明文件包含内容如下:
**表1** 包说明文件
| 文件名 | 含义 | 是否必须 |
| -------- | -------- | -------- |
| bundle.json | 元数据声明文件 | 必须 |
| README.md | 自述文件 | 必须 |
| LICENSE | 许可协议文本文件 | 必须 |
| CHANGEME.md | 变更日志文件 | 非必须 |
包内容文件可以是以下任意内容:
- 被分发的部件的二进制文件
- 被分发的部件源代码文件
- 编译脚本文件
**图1** 部件Part和发行版Part的关系
![zh-cn_image_0000001195369804](figures/zh-cn_image_0000001195369804.png)
## HPM介绍
HPM是连接消费方和提供方的一个开放的协作平台,全称是OpenHarmony Package Manager(即包管理器),Part是HPM管理的对象。
通过构建统一的中央仓作为分发渠道,以Part作为载体,提供方发布Part,消费方下载使用Part,实现平台上的供需双方共赢。
- 提供方声明Part的属性,将内容发布到平台上。
- 消费方通过声明对Part指定版本的依赖,获取到所需的资源。
通过HPM完成提供方和消费方的需求匹配。
**图2** HPM功能介绍
![zh-cn_image_0000001240409717](figures/zh-cn_image_0000001240409717.png)
**HPM主要分为两部分:**
- **客户端的命令行工具:hpm-cli(发布在[@ohos/hpm-cli](https://www.npmjs.com/package/@ohos/hpm-cli))**
hpm-cli是一个跨平台包管理器命令行工具,包含一系列的命令(创建、编译、安装、打包、运行、发布等),开发者使用这些命令完成HPM Part的生命周期管理。
- **服务器端的资源仓库:[DevEco Marketplace](https://repo.harmonyos.com)**
[DevEco Marketplace](https://repo.harmonyos.com)提供了Part的注册、存储和分类检索等功能,每一个Part都有一个页面显示它的自述文件、依赖关系、历史版本、变更记录、许可协议、下载量、源码仓库地址等信息,开发者可以向资源仓库中发布Part,参与OpenHarmony生态的建设。
# HPM Part开发指导
## HPM Part开发指导概述
通常情况下,[DevEco Marketplace](https://repo.harmonyos.com)中能找到您开发常用的资源,可以通过依赖将所需的资源引入工程中。若现有的资源不能完全满足,可以自己开发并将其以HPM Part的格式发布。安装好hpm-cli工具后,就可以进行Part的开发了。
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> 下述操作建议在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
```
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> -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}
```
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> - -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)搜索模板。
![zh-cn_image_0000001217486680](figures/zh-cn_image_0000001217486680.png)
### 将现有工程定义为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"
]
}
```
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> - “executable”是gn内置模板,可以用“gn help executable ”查看使用方法。
>
> - “sources ”是源码路径,“include_dirs ”是头文件路径。
### 执行编译
在当前文件夹下,执行编译命令:
```
hpm build
```
在完成一系列的编译动作后,显示build succeed。检查编译的输出结果:
![zh-cn_image_0000001262166533](figures/zh-cn_image_0000001262166533.png)
### 编译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
```
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> - 为避免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 &lt;name&gt;命令安装依赖(依赖写入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 # <---引用的组件将会出现在这
```
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> - 在项目安装的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的功能。
# HPM Part参考
本文档将介绍HPM的Part的构成,包类型、划分原则、元数据字段以及相关命令行工具的常用命令等。
### Part划分原则
原则上应尽可能划分为细颗粒度的Part,以满足最大限度的复用。主要考虑以下几点:
- 独立性:Part的功能应该相对独立,支持独立编译,可以单独对外提供接口和服务;
- 耦合性:如果Part必须依赖其他的Part,才能对外提供服务,应考虑和被依赖的Part合并为一个Part。
- 相关性:如果一组Part共同完成一项功能,且没有被其他Part依赖,未来也没有被依赖的可能,则可以考虑合并为一个Part。
### Part类型
Part是为复用而生,一切可以复用的部件都可以定义为Part,可以分为:
**表1** HPM Part分类
| 部件 | 说明 |
| -------- | -------- |
| source | 以源码形式分发,被目标工程依赖、可独立编译。 |
| binary | 以二进制形式分发,不包含源代码,例如编译工具。 |
| code-segment | 以代码片段形式分发,无法独立编译,安装后还原到指定目录,在目标工程参与其他代码编译。 |
| distribution | 以发行版形式分发,依赖其他Part,不包含源码(编译脚本除外),编译输出为系统镜像。 |
| template | 以模板形态分发,用于hpm&nbsp;init创建模板。 |
| plugin | 以插件形态分发,作为hpm&nbsp;cli的插件,扩展hpm&nbsp;cli的功能。 |
### Part构成
一个Part包一般包含如下内容:
- Part包的代码或库(src目录下的代码文件)
- ohos_bundles文件夹(存放依赖的Part,安装Part时自动生成,无需提交到代码库)
- Part包的说明文件(README.md)
- Part包元数据声明文件(bundle.json)
- 开源许可文件(LICENSE)
```
my-bundle
|_ohos_bundles
|_headers
|_src
|_bundle.json
|_README.md
|_LICENSE
```
### src源代码
Part的代码文件和普通的代码目录没有差异。但要注意的是,Part中对外暴露的接口(头文件),会被其他Part所引用,需要单独在bundle.json的dirs中声明。
### README文件
为了帮助他人在[DevEco Marketplace](https://repo.harmonyos.com)上找到该Part,并更方便的使用它,在Part的根目录中包含一个README文件。
README.md,为markdown格式的描述关于Part自述说明文件。
README文件应包括如何安装,配置和使用Part包中的实例代码说明,以及可能会对用户有所帮助的任何其他信息。
自述文件将显示在[DevEco Marketplace](https://repo.harmonyos.com)的Part的详情页面中。
## bundle.json文件
bundle.json文件是对当前Part的元数据描述,每个Part中必须包含一个bundle.json文件。主要内容如下:
```
{
"name": "@myorg/demo-bundle",
"version": "1.0.0",
"license": "MIT",
"description": "bundle description",
"keywords": ["hos"],
"tags": ["applications", "drivers"],
"author": {"name":"","email":"","url":""},
"contributors":[{"name":"","email":"","url":""},{"name":"","email":"","url":""}],
"homepage": "http://www.foo.bar.com",
"repository": "https://git@gitee.com:foo/bar.git",
"private": false,
"publishAs": "code-segment",
"segment":{
"destPath":"/the/dest/path"
},
"dirs": {
"src": ["src/**/*.c"],
"headers": ["headers/**/*.h"],
"bin": ["bin/**/*.o"]
},
"scripts": {
"build": "make"
},
"envs": {},
"ohos": {
"os": "2.0.0",
"board": "hi3516",
"kernel": "liteos-a"
},
"rom": "10240",
"ram": "1024",
"dependencies": {
"@myorg/net":"1.0.0"
}
}
```
bundle.json文件具有如下功能:
- name:定义Part的名称,放到组织下, 以\@开头,/分割,如:\@myorg/mybundle
- version:定义Part版本号,如1.0.0,需满足semver的标准。
- description:一句话对Part进行简要的描述。
- dependencies:定义Part的依赖Part。
- envs: 定义Part编译时所需要的参数,包括全局参数以及依赖所需的参数。
- scripts:定义在当前Part下能够执行的命令(如编译,构建,测试,烧录等)。
- publishAs:定义Part的发布类型(source:源码,binary:二进制,distribution:发行版,code-segment:代码片段)。
- segment: 仅针对code-segment类型的Part,定义Part的目标路径(即安装后,Part包中包含的文件复制到的目标路径)
- dirs:定义发布时打包的目录结构(如头文件)。
- ram&amp;rom:统计相关信息:预计占用ROM和RAM信息。
- ohos:描述OpenHarmony操作系统版本、开发板及内核的匹配关系(多个请用英文逗号的“,”分割)。
- 定义其他扩展信息:作者,主页,代码仓库,许可协议,标签,关键字。
- 对于发行版类型,可以定义继承关系,用base字段描述继承自的基础发行版及版本。
- private:定义是否为私有包,私有包在公共的注册中心中无法被其他用户搜索到,默认为false(只有组织的类型为)。
## HPM CLI命令
Part的全生命周期管理,可以通过hpm命令工具进行操作,hpm的操作命令如下(详细帮助可以执行hpm -h学习):
**表2** hpm操作命令
| 命令类别 | 命令行 | 含义说明 |
| -------- | -------- | -------- |
| 版本查询 | hpm&nbsp;-V或hpm&nbsp;--version | 查看hpm-cli版本号。 |
| 帮助查询 | hpm&nbsp;-h或hpm&nbsp;--version | 查看命令列表及帮助。 |
| hpm&nbsp;-h | 查看命令帮助。 |
| 创建 | hpm&nbsp;init&nbsp;bundle | 创建Part工程。 |
| hpm&nbsp;init&nbsp;-t&nbsp;template | 根据模板创建脚手架工程。 |
| 安装 | hpm&nbsp;install或hpm&nbsp;i | 安装bundle.json中依赖的Part。 |
| hpm&nbsp;install&nbsp;bundle\@version | 安装指定Part版本。 |
| 卸载 | hpm&nbsp;uninstall&nbsp;bundle | 删除depedencies依赖的Part。 |
| hpm&nbsp;remove或hpm&nbsp;rm&nbsp;bundlename | 删除depedencies依赖的Part。 |
| 查看 | hpm&nbsp;list或者hpm&nbsp;ls | 显示当前HPM&nbsp;Part的依赖树。 |
| hpm&nbsp;dependencies | 生成当前HPM&nbsp;Part依赖关系数据(在hpm&nbsp;ui也集成了该命令的调用,可以图形化的展示) |
| 搜索 | hpm&nbsp;search&nbsp;name | 搜索Bundle,--json,可以以json格式输出&nbsp;-type&nbsp;可以设置搜索Bundle的类型,包括part、distribution、code-segment三种。 |
| 设置hpm配置项 | hpm&nbsp;config&nbsp;set&nbsp;key&nbsp;value | 设置配置值,如服务器地址,网络代理。 |
| hpm&nbsp;config&nbsp;delete&nbsp;key | 删除配置。 |
| 更新 | hpm&nbsp;update | 更新当前Part依赖的Part的版本。 |
| hpm&nbsp;check-update | 检查依赖的Part版本是否有更新。 |
| 编译 | hpm&nbsp;build | 编译HPM&nbsp;Part。 |
| hpm&nbsp;dist | 针对发行版(distribution),发行版编译构建(依赖bundle.json的scripts中的dist脚本)。 |
| 打包 | hpm&nbsp;pack | 本地Part打包依赖。 |
| 烧录 | hpm&nbsp;run&nbsp;flash | 烧录固件(依赖bundle.json的scripts中的flash脚本)。 |
| 发布 | hpm&nbsp;publish | 发布Part,发布的Part在仓库中必须唯一,且版本唯一(需要账号登录)。 |
| 执行扩展命令 | hpm&nbsp;run | 执行bundle.json文件中定义的scripts脚本命令,支持多个命令可用&nbsp;&amp;&amp;&nbsp;连接。 |
| 解压包 | hpm&nbsp;extract | 解压文件.&nbsp;支持格式'zip'、'tar','tgz'&nbsp;和'.tar.gz' |
| 启动图形化界面 | hpm&nbsp;ui | 本地启动HPM&nbsp;UI,可通过-p参数指定端口,Windows平台下会启动默认的浏览器打开 |
| 多语言切换 | hpm&nbsp;lang | 切换中英文操作界面(同时支持命令行和UI) |
| 转换为hpm包格式 | hpm&nbsp;x2h | 将一个maven格式或npm格式包转换成hpm的包格式,并发布到HPM |
| 代码段还原或清理 | hpm&nbsp;code&nbsp;clean\|restore | 针对依赖的代码段(code-segment)Part,执行清理或还原操作(即根据segment.destPath执行拷贝/删除操作) |
| 生成秘钥 | hpm&nbsp;gen-keys | 生成公钥/私钥对,将公钥配置到[DevEco&nbsp;Marketplace](https://repo.harmonyos.com),可以实现hpm-cli免密登录,发布Part。 |
| 生成第三方开源说明 | hpm&nbsp;gen-notice | 根据每个Part的说明,生成一份合并后的第三方开源说明的合并文件。 |
## 关于依赖
Part的依赖分为必选依赖和可选依赖。
- 必选依赖:是指Part A在完成某个功能时,必须引入Part B,调用B的接口或服务配合才能完成。称B为A的必选依赖。
- 可选依赖:是在Part A在完成某个功能时,可以引入Part C,也可以引入Part D。C和D可以相互替换,称C和D为A的可选依赖。
```
"dependencies": {
"@myorg/core":"1.0.0",
"?@myorg/plugin1":"1.0.0",
"?@myorg/plugin2":"1.1.0"
}
```
Part的依赖关系分为编译依赖和开发依赖。
- 编译依赖:运行时需要的依赖。
- 开发依赖:非运行时需要的依赖,如静态检查、编译、打包、测试、格式化工具等。
```
"dependencies": {
"@myorg/core":"1.0.0"
},
"devDependencies": {
"@myorg/tool":"1.0.0"
}
```
依赖中可以定义标签,对引入的依赖进行分组。在脚本中可以根据标签,获得这一组依赖的路径。定义的标签以\#开头,具体定义的方式为:
```
{
"dependencies": {
"#tool": {
"first_bundle": "1.0.0",
"second_bundle": "1.0.0"
},
"#drivers": {
"xx_bundle": "1.0.0",
"yy_bundle": "1.0.0"
}
}
}
```
Part的依赖关系(包括间接依赖)可以通过hpm list命令显示(也可以通过hpm ui命令在可视化的页面中显示)
```
$ hpm list
+--demo@1.0.0
| +--@huawei/media@1.0.2
| +--@demo/sport_hi3518ev300_liteos_a@1.0.0
| | +--@demo/app@4.0.1
| | | +--@demo/build@4.0.1
| | | +--@demo/arm_harmonyeabi_gcc@4.0.0
| | +--@demo/liteos_a@4.0.0
| | | +--@demo/third_party_fatfs@4.0.0
| | | +--@demo/arm_harmonyeabi_gcc@4.0.0
| | +--@demo/init@4.0.0
| | +--@demo/dist_tools@4.0.0
```
## 关于环境变量
Part在编译的过程中需要依赖系统提供的环境变量来自定义输出,链接所需二进制文件等。
这里提出的环境变量均指根据需求把所需变量注入脚本执行的上下文中。
所以在脚本中可以直接获取到变量的值。下面介绍当前系统存在的几种环境变量。
**内置环境变量**
- DEP_OHOS_BUNDLES:表示ohos_bundles文件夹所在的路径。
- DEP_BUNDLE_BASE:表示最外层Part的路径。
**全局环境变量**
全局环境变量由bundle.json中的envs属性来定义。整个Part中的依赖都可以获取到全局变量定义的值。
```
{
"envs": {
"compileEnv": "arm"
}
}
```
不同Part在引入依赖的过程中可以传入不同的参数,从而使依赖的编译可以满足当前Part的需求。依赖中定义的参数可以在对应依赖脚本执行的上下文中获取到。
```
{
"dependencies": {
"my-bundle": {
"version": "1.0.0",
"mode": "debug"
}
}
}
```
Part在链接二进制文件的时候,需要知道二进制文件在依赖中的路径,所以依赖的路径会作为环境变量传入编译Part中。
传入的环境变量的格式为DEP_BundleName,BundleName为依赖的名称,例如DEP_first_bundle。
## 关于命名和版本号
1. 名称需要为全小写的英文字母或数字,中间可以使用下划线分隔。如 "bundle"、 "my_bundle"、"json2"。
2. 发布到[DevEco Marketplace](https://repo.harmonyos.com)的Part的名称,需要以\@开头,通过组织名用/隔离, 如\@my_org/part_name
3. 组织名+Part名称,需要是唯一的,且不容易和其他作者的Part名称混淆。
4. 名称应该是容易理解,而非无意义的字母组合。
5. 版本号应该遵循语义化命令格式:即 "主版本号.次版本号.修订号" 或 "主版本号.次版本号.修订号-先行版本号",比如 "1.0.0", "1.0.0-beta",详细规格可以参考 [https://semver.org](https://semver.org/)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册