HarmonyOS鸿蒙Next中自定义插件,插件生命周期不回调

HarmonyOS鸿蒙Next中自定义插件,插件生命周期不回调 插件初始化代码执行了,打印了:qg-插件初始化,其他log都未打印。工程可以运行起来

插件实现代码:

import { HvigorNode, HvigorPlugin, hvigor } from '@ohos/hvigor';
import { OhosHapContext, OhosPluginId, } from "@ohos/hvigor-ohos-plugin";
// import fs from 'fs';

export function excutePlugin() {
return [customPlugin()]
}

function customPlugin() {
return {
pluginId: 'my-custom-plugin',
apply() {
console.log('qg-插件初始化')
hvigor.taskGraphResolved(() => {
console.log('qg-任务依赖图解析完成')
})

hvigor.nodesEvaluated(() => {
hvigor.getRootNode().subNodes(subNode => {
console.log('qg-节点名称:', subNode.getNodeName())
})
})

hvigor.buildFinished(result => {
console.log('qg-构建结果:', result)
})
}
}
}

工程中hvigorfile.ts 调用代码

import { appTasks } from '@ohos/hvigor-ohos-plugin';
import {customPlugin, excutePlugin} from '@app/task-test-plugin'
import { HvigorNode, HvigorPlugin, hvigor } from '@ohos/hvigor';

// hvigor.buildFinished(buildResult => {
//   console.log('qg-项目中添加:构建结束,状态:', buildResult);
// });

export default {
  system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */
  plugins: [...excutePlugin()]       /* Custom plugin to extend the functionality of Hvigor. */
}

更多关于HarmonyOS鸿蒙Next中自定义插件,插件生命周期不回调的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

加油,

更多关于HarmonyOS鸿蒙Next中自定义插件,插件生命周期不回调的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


加油,

鸿蒙Next自定义插件生命周期不回调,通常由以下原因导致:

  1. 插件未在module.json5中正确声明。
  2. 插件类未实现正确的生命周期接口。
  3. 插件包结构或依赖配置有误。
  4. 插件未在需要时被系统加载或实例化。

请检查上述配置,确保符合HarmonyOS Next的插件开发规范。

根据您提供的代码,问题很可能出在插件注册的时机上。在HarmonyOS Next的hvigor构建系统中,插件生命周期的回调(如taskGraphResolvednodesEvaluatedbuildFinished)需要在构建流程开始之前就完成注册。

您的customPlugin函数在apply()方法中打印了初始化日志,但注册生命周期回调的代码(hvigor.taskGraphResolved等)也放在了apply()方法里。apply()方法本身是在hvigor初始化插件时被调用的,这个时机虽然早,但可能已经错过了某些早期生命周期事件的派发点,尤其是当插件通过plugins数组动态导入时。

核心原因是:生命周期监听器的注册需要在模块顶层或立即执行的函数中进行,以确保在hvigor构建生命周期的最早阶段完成绑定,而不是在插件apply时才执行。

解决方案如下:

请修改您的插件实现文件(例如task-test-plugin.ts),将生命周期回调的注册移到apply()方法外部、模块的顶层作用域中。确保这些hvigor.xxx调用在模块被导入时立即执行。

修改后的插件代码示例:

import { HvigorNode, HvigorPlugin, hvigor } from '@ohos/hvigor';
import { OhosHapContext, OhosPluginId, } from "@ohos/hvigor-ohos-plugin";

// --- 关键修改:在模块顶层立即注册生命周期钩子 ---
hvigor.taskGraphResolved(() => {
    console.log('qg-任务依赖图解析完成')
})

hvigor.nodesEvaluated(() => {
    hvigor.getRootNode().subNodes(subNode => {
        console.log('qg-节点名称:', subNode.getNodeName())
    })
})

hvigor.buildFinished(result => {
    console.log('qg-构建结果:', result)
})
// --- 顶层注册结束 ---

export function excutePlugin() {
    return [customPlugin()]
}

function customPlugin() {
    return {
        pluginId: 'my-custom-plugin',
        apply() {
            // 这里只执行插件本身的初始化逻辑
            console.log('qg-插件初始化')
        }
    }
}

修改说明:

  1. hvigor.taskGraphResolvedhvigor.nodesEvaluatedhvigor.buildFinished这三个生命周期监听器的注册代码,从customPlugin()函数内部的apply()方法中移出。
  2. 将它们直接放置在模块的顶层作用域。这样,当@app/task-test-plugin模块在hvigorfile.ts中被import时,这些监听器会立刻注册到hvigor全局实例上。
  3. 插件apply()方法中只保留插件自身的初始化代码(例如打印'qg-插件初始化')。

原理: hvigor的生命周期事件是全局的,并且其派发时机可能早于所有插件的apply()方法被调用。通过在模块顶层注册,可以保证监听器在构建流程的初始阶段就已就绪,从而能捕获到所有后续事件。

您的hvigorfile.ts中的调用方式保持不变。完成上述修改后,清理构建缓存(删除build目录或执行hvigor clean),然后重新运行构建,应该就能看到完整的生命周期日志输出了。

回到顶部