Hvigor 自定义插件

889 阅读2分钟

关键模型

HvigorPlugin
    // 插件的唯一标示ID(必须)
    pluginId: string;
    // 插件元数据定义(可选)
    context?: (() => any) | any;
    // (必须)插件的主体方法,定义插件实现逻辑(例如任务注册等)
    // 在hvigor的生命周期配置阶段调用,进行task的注册
    apply: (node: HvigorNode) => void | Promise<void>;

HvigorNode
    // 向当前节点注册任务
    registerTask: (task: HvigorTask) => void;
    // ... 省略其他API

HvigorTask
    /**
     * 任务名称,全局唯一
     */
    name: string;
    /**
     * task 上下文
     */
    context?: (() => any) | any;
    /**
     * Task 定义增量输入接口
     *
     * @param input
     */
    input?: (input: TaskInput) => void;
    /**
     * task 定义增量输出接口
     *
     * @param output
     */
    output?: (output: TaskOutput) => void;
    /**
     * task beforeRun 在run方法之前执行
     *
     * @param taskContext
     */
    beforeRun?: (taskContext: HvigorTaskContext) => void | Promise<void>;
    /**
     * 增量输入输出
     *
     * @param taskContext
     */
    afterRun?: (taskContext: HvigorTaskContext) => void | Promise<void>;
    /**
     * Task执行逻辑,执行时调用此方法
     *
     * @param taskContext
     */
    run: (taskContext: HvigorTaskContext) => void | Promise<void>;
    /**
     * 当前Task依赖的Task列表
     * 前置依赖的tasks, 先执行前置依赖,再执行此task
     */
    dependencies?: (() => string[]) | string[];
    /**
     * 后置依赖的tasks, 执行后置依赖前,必须先执行此task
     */
    postDependencies?: (() => string[]) | string[];
TaskInput
    file(path: string): TaskInput;
    files(paths: string[]): TaskInput;
    property(key: string, value: TaskInputValue): TaskInput;
TaskOutput
    file(path: string): TaskOutput;
    files(paths: string[]): TaskOutput;

HvigorTaskContext
    /**
     * 当前编译的模块的名称
     */
    moduleName: string;
    /**
     * 当前编译的模块的路径
     */
    modulePath: string;

尽管官方在 hvigor npm 包中的 index.d.ts 文件中声明下面导出代码

/** Hvigor 基础接口 **/

export { HvigorPlugin, HvigorNode, HvigorTask, HvigorTaskContext, Task, TaskInput, TaskOutput, } from './src/base/external/api/hvigor-api.js';

但实际上在 index.js 中除了 TaskInput, TaskOutput 均未导出,但是这个不影响自定义插件的实现,只要我们实现的类符合这个接口定义即可。

实现入口

entry/hvigorfile.ts

import { hapTasks } from '@ohos/hvigor-ohos-plugin';

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

plugins:[]属性就是自定义插件注册的入口

自定义插件 Hello world

class TaskHello {
    name: string = 'taskHello'
    node: HvigorNode
    constructor(node: HvigorNode) {
        this.node = node
    }
    run (taskContext) {
        console.log('TaskHello run is called')
    }
}

class MyHvigorPlugin {
    pluginId: string = 'MyHvigorPlugin'
    apply(node) {
        console.log('MyHvigorPlugin apply is called')
        node.registerTask(new TaskHello(node))
    }
}

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

运行 Task

./hvigorw taskHello
输出
MyHvigorPlugin apply is called
taskHello run is called
> hvigor Finished :entry:taskHello... after 1 ms 
> hvigor BUILD SUCCESSFUL in 818 ms

总结

  • 了解 hvigor 自定义插件的关键 API 模型
  • 了解 hvigor 自定义插件 apply 入口
  • 根据 API 模型实现了一个自定义插件和 Task

推荐阅读