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

8 回复
  • 可以用本地依赖,但要先区分两个概念:“一个入口 HAR 依赖多个子包”和“把多个独立 HAR 物理合并成一个 HAR 文件”。后者通常不是构建器自动做的事情,前者才是更推荐的依赖管理方式。

  • 你的 A/B/C/D/E 这种结构可以这样处理:

  1. D、E 作为底层模块,B、C 在模块级 oh-package.json5dependencies 中依赖 D/E。
  2. A 在 dependencies 中依赖 B/C。依赖可以是远程/私仓版本,也可以是本地 HAR、本地源码目录,或新版本 DevEco 支持的 @module 模块引用。
  3. 构建 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顺序。

  1. 先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"
    }
    
  2. 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"
    }
    
  3. make A,在build里找har包。就是你要的了。

  4. 在DevEco Studio里双击har,看看打包结果就行。

我了解到的方法还是差不多,参考一下:

新建一个封装模块,统一导出并通过本地 file 依赖打包(推荐)

这是官方社区和开发者普遍推荐的方案,与你分享“将所有模块打包成一个 HAR”的思路一致。

  1. 创建统一封装模块:在你的工程中新建一个 Library 模块,例如命名为 entry_har,它将作为统一的出口供外部使用。

  2. 配置本地 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"
      }
    }
    
  3. 统一导出接口:在 entry_har 模块的 Index.ets 文件中,将你希望对外暴露的 B、C、D、E 模块的组件、方法等重新导出。

    ts

    // entry_har/Index.ets
    export { SomeComponentFromB } from 'module_b';
    export { SomeFunctionFromC } from 'module_c';
    // ... 导出其他需要暴露的接口
    
  4. 构建输出:最后,只需编译 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:../Dfile:../E依赖。然后在A模块目录执行hvigorw assembleHar,构建工具会自动解析并编译所有本地依赖模块,将其打包进A生成的HAR产物,最终交付的HAR即包含完整功能。

回到顶部