HarmonyOS鸿蒙Next中我现在有多个包,如何把这几个包构建成一个har
HarmonyOS鸿蒙Next中我现在有多个包,如何把这几个包构建成一个har 【问题描述】:我现在有多个包,如何把这几个包构建成一个har
【问题现象】:例如我有A、B、C、D、E、五个模块
A依赖B、C;
B依赖D、E; C也依赖D、E
现在我想把A打成一个包提供给其他项目使用,有什么方案吗?
目前我看有如果环境支持使用私有仓库,可以考虑将B模块打包成har文件并上传到私仓。然后在A模块中配置依赖B模块的版本。这样,当打包A模块时,B模块也会被自动包含进去。
如果module较多,目前有个方案是把所有包都上传私仓,方便后续版本管理
想问下不上传私仓直接依赖本地文件可以打包进去吗?
【版本信息】:未涉及
【复现代码】:未涉及
【尝试解决方案】:未涉及
更多关于HarmonyOS鸿蒙Next中我现在有多个包,如何把这几个包构建成一个har的实战教程也可以访问 https://www.itying.com/category-93-b0.html
-
可以用本地依赖,但要先区分两个概念:“一个入口 HAR 依赖多个子包”和“把多个独立 HAR 物理合并成一个 HAR 文件”。后者通常不是构建器自动做的事情,前者才是更推荐的依赖管理方式。
-
你的 A/B/C/D/E 这种结构可以这样处理:
- D、E 作为底层模块,B、C 在模块级
oh-package.json5的dependencies中依赖 D/E。 - A 在
dependencies中依赖 B/C。依赖可以是远程/私仓版本,也可以是本地 HAR、本地源码目录,或新版本 DevEco 支持的@module模块引用。 - 构建 A 时,A.har 会带有依赖声明;使用方安装/集成 A 时,依赖树会解析 B/C/D/E。这里不是把所有代码压扁塞进 A.har,而是通过 ohpm 依赖树管理。
-
如果外部项目只能接收一个单文件、不能解析子依赖,那就建议做一个 facade HAR:把真正要对外暴露的 API、组件在 A 的
Index.ets中统一export,必要时把源码迁到同一模块内;不要依赖“多 HAR 自动 flatten”这种方式。 -
另外,参与运行/编译的依赖要放在
dependencies,不要放devDependencies。私仓方案更适合多人协作和版本管理,本地file:更适合本机验证或单仓工程。
更多关于HarmonyOS鸿蒙Next中我现在有多个包,如何把这几个包构建成一个har的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
你这个没有循环依赖,不用私库,直接本地打包就行。Build–>make module顺序。
-
先make D 和 E,生成har包。 分别在B和C的 oh-package.json5配置如下,配置完在B和C模块执行 ohpm install。可以在oh_modules文件夹下看是否安装上。
"dependencies": { "d": "file:xx/xx/d.har" // 此处也可以是以当前oh-package.json5所在目录为起点的相对路径。 "e": "file:xx/xx/e.har" } -
make B 和 C,生成har包。 在A的oh-package.json5配置如下,配置完在A模块执行 ohpm install。检查oh_modules文件夹下看是否安装上。
"dependencies": { "b": "file:xx/xx/b.har" // 此处也可以是以当前oh-package.json5所在目录为起点的相对路径。 "c": "file:xx/xx/c.har" } -
make A,在build里找har包。就是你要的了。
-
在DevEco Studio里双击har,看看打包结果就行。
我了解到的方法还是差不多,参考一下:
新建一个封装模块,统一导出并通过本地 file 依赖打包(推荐)
这是官方社区和开发者普遍推荐的方案,与你分享“将所有模块打包成一个 HAR”的思路一致。
-
创建统一封装模块:在你的工程中新建一个 Library 模块,例如命名为
entry_har,它将作为统一的出口供外部使用。 -
配置本地
file依赖:在entry_har模块的oh-package.json5文件中,通过"file:../module_name"的方式,声明对B,C,D,E本地模块源码的依赖。json
// entry_har/oh-package.json5 { "name": "entry_har", "version": "1.0.0", "dependencies": { "module_b": "file:../B", "module_c": "file:../C", "module_d": "file:../D", "module_e": "file:../E" } } -
统一导出接口:在
entry_har模块的Index.ets文件中,将你希望对外暴露的 B、C、D、E 模块的组件、方法等重新导出。ts
// entry_har/Index.ets export { SomeComponentFromB } from 'module_b'; export { SomeFunctionFromC } from 'module_c'; // ... 导出其他需要暴露的接口 -
构建输出:最后,只需编译
entry_har这个模块即可。构建出的entry_har.har文件,就能供其他项目直接使用了。
这样试一下
第一步:发布叶子模块(没有依赖别人的)
先上传 D.har
再上传 E.har
第二步:发布中间层模块(依赖叶子模块)
发布 B.har(自动带上 D、E 的引用)
发布 C.har(自动带上 D、E 的引用)
第三步:发布顶层模块
发布 A.har(自动带上 B、C 的引用)
发布之后,后续项目直接 ohpm install a 就够了
理论上是这样 但是我没有实践过 你试试 , 说白了就是一层一层的 去解套
建议通过私仓去处理
如果不通过私仓:
你A依赖B、C的同事要在Index.ets页面把该导出的导出,特别是属于D、E的也要导出,不然依赖A时用不了DE里面的数据
你这样试试看行不行
目前不支持直接将多个独立的模块(Module)直接合并打包成一个HAR包。但是,可以通过构建一个“统一导出接口的HAR”来实现将多个模块的代码整合到一个HAR中对外提供。
在HarmonyOS Next中,将多个包合并为一个HAR,可以在项目的oh-package.json5中通过dependencies引用各模块,并利用harBuilder工具或修改hvigor的打包配置,将指定模块的产物聚合打包。也可将各模块源代码统一放入一个模块下,重新构建生成HAR。
在HarmonyOS Next中,将多个模块打包进一个HAR无需上传私仓,直接使用本地文件依赖即可。把所有模块(A、B、C、D、E)放在同一工程目录下,在A模块的oh-package.json5中配置对B、C的本地依赖,如:
"dependencies": {
"B": "file:../B",
"C": "file:../C"
}
B、C同理,各自配置对D、E的file:../D、file:../E依赖。然后在A模块目录执行hvigorw assembleHar,构建工具会自动解析并编译所有本地依赖模块,将其打包进A生成的HAR产物,最终交付的HAR即包含完整功能。

