HarmonyOS鸿蒙Next中hvigor动态添加模块不生效

HarmonyOS鸿蒙Next中hvigor动态添加模块不生效

hvigor.nodesEvaluated(() => {
  const appContext = hvigor.getRootNode().getContext(OhosPluginId.OHOS_APP_PLUGIN) as OhosAppContext;
  const buildProfileOpt = appContext.getBuildProfileOpt();
  // 添加一个工程外的模块
  const newModule = {
    "name": "har",
    "srcPath": "./../MyApplication40/har",// 确保该源码模块存在
  }
  buildProfileOpt.modules.push(newModule);
  appContext.setBuildProfileOpt(buildProfileOpt);
  console.log(buildProfileOpt.modules.map(module => {
    return module.name;
  }));
});

这种上面这种方式动态添加模块,构建时报错:

2103 ERROR: 10311002 ArkTS: ERROR

Error Message: Failed to resolve OhmUrl. Failed to get a resolved OhmUrl for “xxx” imported by “xxx”.

如果这个模块是静态添加的可以构建成功

ide 版本号为5.1.0release


更多关于HarmonyOS鸿蒙Next中hvigor动态添加模块不生效的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

调整 Hvigor Hook 的使用时机

尝试将原来的 nodesEvaluated 换成更合适的回调,例如:

hvigor.beforeNodeEvaluate(node => {
  if (node.isRoot()) {
    const appCtx = node.getContext(OhosPluginId.OHOS_APP_PLUGIN) as OhosAppContext;
    const buildProfile = appCtx.getBuildProfileOpt();
    buildProfile.modules.push({
      name: "har",
      srcPath: "../MyApplication40/har",
    });
    appCtx.setBuildProfileOpt(buildProfile);
  }
});

或者:

hvigor.afterNodeEvaluate(node => {
  if (node.isRoot()) {
    // 同上逻辑
  }
});

这样的方式可以确保模块信息在节点完成评估阶段前被注册,从而更安全地注入到后续的构建流程中。

更多关于HarmonyOS鸿蒙Next中hvigor动态添加模块不生效的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


【背景知识】 HAR(Harmony Archive)是静态共享包,可以包含代码、C++库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。 引用三方HAR,包括从仓库进行安装、从本地文件夹和本地压缩包中进行安装三种方式。

  • 引用ohpm仓中的HAR:首先需要设置三方HAR的仓库信息,DevEco Studio默认仓库地址为OpenHarmony三方库中心仓,如果想设置自定义仓库,需要在DevEco Studio的Terminal窗口执行如下命令进行设置(执行命令前,确保已配置OHPM代理,第一次配置需重启DevEco Studio)。然后设置三方包依赖信息,配置依赖信息具体参考引用共享包
ohpm config set registry your_registry1,your_registry2
  • 引用本地模块源码:本地模块必须与宿主模块归属于同一个工程,如entry模块需要依赖foo模块的源码。
  • 引用本地HAR/HSP包:配置示例具体参考引用共享包

【解决方案】 三方提供的HAR库有"packageType": "InterfaceHar"字段,解决方法如下:

  • 在工程目录下找到oh_modules -> .ohpm文件夹,在该目录中,找到报错信息中的hvigor_ignore_xxxxx的源文件,删除hvigor_ignore_xxxxx所在模块的oh_package.json5中的"packageType": “InterfaceHar”。
  • 联系三方库供应商提供一下最新的sdk。

nodesEvaluated回调发生在配置阶段结束后(网页3、网页4),此时模块依赖关系已解析完毕。此时添加新模块会导致:

新增模块未被纳入初始依赖分析

模块路径解析未触发(产生OhmUrl解析错误)

"./…/MyApplication40/har"的相对路径在动态添加时可能存在解析基准路径差异,导致实际路径与预期不符

建议尝试

将配置修改操作迁移至构建生命周期初始化阶段

// 修改位置:hvigorconfig.ts
hvigor.beforeNodeEvaluate((node) => {
  const appContext = node.getContext(OhosPluginId.OHOS_APP_PLUGIN);
  if (appContext) {
    const buildProfileOpt = appContext.getBuildProfileOpt();
    buildProfileOpt.modules.push({
      name: "har",
      srcPath: "${PROJECT_ROOT}/../MyApplication40/har"
    });
    appContext.setBuildProfileOpt(buildProfileOpt);
  }
});

钩子函数选择不当 nodesEvaluated阶段已处于构建生命周期的配置阶段末期,此时模块加载流程已完成。需改用更早期的钩子如beforeNodeEvaluate或nodesInitialized: // 在hvigorconfig.ts中使用 hvigor.beforeNodeEvaluate((node) => { if (node.name === ‘root’) { const appContext = node.getContext(OhosPluginId.OHOS_APP_PLUGIN); // 模块添加逻辑 } })

根据楼主的问题和代码,动态添加模块失败的原因应该是构建阶段的生命周期控制和模块路径解析机制的限制。

nodesEvaluated回调触发时已处于配置阶段后期,此时模块依赖关系已固化。动态添加的模块无法被编译管线正确识别,导致OhmUrl解析失败。静态添加模块能生效,是因为构建系统在初始化阶段已加载所有模块配置。

另外你动态添加的srcPath: "./…/MyApplication40/har"使用相对路径,但在构建时Hvigor的上下文路径可能与预期不同,导致实际路径解析错误。还有动态添加模块时未触发插件重新加载,导致新模块的上下文信息缺失。

你试试将模块添加逻辑迁移至更早的构建阶段,使用configEvaluated代替nodesEvaluated,确保在配置评估阶段完成模块注入,并采用${PROJECT_ROOT}宏定义确保路径解析正确:

// hvigorconfig.ts中配置

import { hvigor } from '@ohos/hvigor'

import { OhosPluginId, OhosAppContext } from "@ohos/hvigor-ohos-plugin"

hvigor.configEvaluated((hvigorConfig) => {

  const appContext = hvigor.getRootNode().getContext(OhosPluginId.OHOS_APP_PLUGIN) as OhosAppContext

  const buildProfileOpt = appContext.getBuildProfileOpt()

  buildProfileOpt.modules.push({

    name: "har",

    srcPath: "${PROJECT_ROOT}/../MyApplication40/har" //使用工程根目录宏

  })

  appContext.setBuildProfileOpt(buildProfileOpt)

})

清除旧配置:

hvigorw clean && hvigorw --mode module -p module=entry@default assembleHap

看一下MyApplication40/har模块的oh-package.json5,声明"har"类型:

{

  "name": "har",

  "version": "1.0.0",

  "type": "har"

}

在HarmonyOS Next中,hvigor动态添加模块不生效,通常是由于配置同步或缓存问题导致。请检查模块的build-profile.json5文件,确保依赖声明正确。执行hvigor clean命令清除缓存,然后重新构建项目。确认模块路径在hvigorfile.ts中已正确定义。

在HarmonyOS Next中,通过hvigor脚本在nodesEvaluated阶段动态修改buildProfileOpt.modules的方式,通常无法正确注册模块到构建系统中。构建系统在早期阶段(如配置解析)已经确定了模块依赖图,后续的动态添加操作可能不会触发完整的模块注册和OhmUrl解析流程。

错误信息Failed to resolve OhmUrl表明动态添加的模块虽然被加入了数组,但其元数据(如模块名称、路径、依赖关系)并未被构建系统的解析器正确识别和处理,导致无法解析模块内的资源路径。

可行的解决方案:

  1. 静态配置优先:确保所有模块都在项目的build-profile.json5文件中进行静态声明。这是最可靠且官方支持的方式。

  2. 使用Product动态能力:如果模块是可选或与产品形态强相关,应使用product定义来实现动态性。在product目录下的.json5文件中配置不同产品所需的模块,构建时通过--product参数指定。这属于构建时配置,而非运行时动态修改。

  3. 检查插件与API兼容性OhosAppContext及相关API可能随版本迭代发生变化。请确认您使用的OhosPluginId.OHOS_APP_PLUGINgetBuildProfileOpt()/setBuildProfileOpt()方法在当前hvigor版本中仍有效且用于此目的。动态操作构建配置的方式并非公共API的常见使用场景,可能不稳定。

  4. 构建后验证:您打印的module.name列表仅代表内存中对象的状态,不代表构建系统已成功接纳该配置。构建错误本身证实了这一点。

由于动态添加模块的这种方式对构建流程的侵入性强且易导致状态不一致,目前更推荐通过静态配置或Product变体来管理模块依赖。

回到顶部