关键模型
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