鸿蒙编译框架插件HvigorPlugin接口的用法介绍

devtools/2025/3/14 15:05:43/

鸿蒙系统中HvigorPlugin接口实现自定义编译插件,实现编译前后自定义功能。

在鸿蒙(HarmonyOS)开发中,HvigorPlugin 是用于扩展 Hvigor 构建工具功能的接口。通过实现此接口,开发者可以自定义构建任务、修改构建流程或集成第三方工具。以下是核心概念和示例:


1. HvigorPlugin 接口定义

interface HvigorPlugin {/*** 插件初始化方法* @param hvigorContext Hvigor 上下文,提供构建配置、任务管理等 API*/apply(hvigorContext: HvigorContext): void;
}

2. 实现自定义插件

步骤 1:创建插件
// CustomPlugin.ts
import { HvigorPlugin, HvigorContext, Task } from '@ohos/hvigor';export class CustomPlugin implements HvigorPlugin {apply(context: HvigorContext) {// 在此注册自定义任务或修改构建流程const taskName = 'customTask';context.taskRegistry.registerTask(taskName, this.customTask);}private customTask: Task = async (context) => {console.log('执行自定义任务');// 在此实现任务逻辑(如文件处理、代码生成等)};
}
步骤 2:在 hvigorfile.ts 中应用插件
// hvigorfile.ts
import { Hvigor } from '@ohos/hvigor';
import { CustomPlugin } from './CustomPlugin';export default function (hvigor: Hvigor) {hvigor.applyPlugin(new CustomPlugin());
}

3. 常用 API

通过 HvigorContext 可访问以下核心功能:

| API 类别 | 方法/属性 | 说明

| |-----------------------|--------------------------|-----------------------------|

任务管理 | taskRegistry | 注册/获取构建任务 |

模块配置 | getModuleConfig() | 获取当前模块的配置信息 |

依赖管理 | dependencies | 管理模块依赖 |

生命周期钩子 | beforeBuild/afterBuild| 在构建前后插入自定义逻辑 |


4. 实战示例:

4.1 自定义编译前添加文件压缩任务
// ZipPlugin.ts
import { HvigorPlugin, HvigorContext, Task } from '@ohos/hvigor';
import * as fs from 'fs';
import * as zlib from 'zlib';export class ZipPlugin implements HvigorPlugin {apply(context: HvigorContext) {context.taskRegistry.registerTask('zipAssets', this.zipAssetsTask);}private zipAssetsTask: Task = async (context) => {const assetsDir = context.getModuleConfig().path.assets;const outputPath = `${assetsDir}/compressed.zip`;// 压缩 assets 目录const zipStream = fs.createWriteStream(outputPath);const gzip = zlib.createGzip();fs.createReadStream(assetsDir).pipe(gzip).pipe(zipStream).on('finish', () => {console.log('资源压缩完成');});};
}
4.2 自定义插件动态更换Dependencies依赖的har包
import { hapTasks, OhosHapContext, OhosPluginId, Target  } from '@ohos/hvigor-ohos-plugin';
import { hvigor, HvigorNode, HvigorPlugin } from '@ohos/hvigor';/*** 判断是否为定制的target* @param targetName flavor target 名称。* @returns*/
function isGMTarget(targetName: string): boolean {if (targetName.match('gm') || targetName.match('sm')) {return true;} else {return false;}
}export function customPlugin(): HvigorPlugin {let gmSdkPath = 'file:./libs/sdk_GM-v1.0.202503102040.har';//let defaultSdkPath = 'file:./libs/sdk_standard-v1.0.202503102040.har';return {pluginId: 'customPlugin',async apply(currentNode: HvigorNode): Promise {const hapContext = currentNode.getContext(OhosPluginId.OHOS_HAP_PLUGIN) as OhosHapContext;hapContext?.targets((target: Target) => {const targetName = target.getTargetName();console.log('customPlugin: targetName=', targetName);//声明依赖sdk文件路径let customsdkPath = '';const dependency = hapContext.getDependenciesOpt();if (isGMTarget(targetName)) {// 新增 或者 修改依赖//国密 target,修改'testsdk'依赖har文件为国密版本sdkcustomsdkPath = gmSdkPath;//dependency['testsdk'] = gmSdkPath;// 删除依赖//delete dependency['har1'];} else if (targetName === 'default') {//默认 target:修改'testsdk'依赖har文件为国密版本sdk//customsdkPath = defaultSdkPath;} else {//默认'testsdk'依赖har文件为标密版本sdk//customsdkPath = defaultSdkPath;}//修改奇安信VPNSDK的依赖文件路径if (customsdkPath !== undefined && customsdkPath !== "") {console.log('customPlugin: Modify dependencies[testsdk]=', customsdkPath);dependency['testsdk'] = customsdkPath;//把修改之后的插件设置回 entry/oh-package.json5文件中的'dependencies'hapContext.setDependenciesOpt(dependency)}});}};
}export default {system: hapTasks,  /* Built-in plugin of Hvigor. It cannot be modified. */plugins:[customPlugin()]         /* Custom plugin to extend the functionality of Hvigor. */
}

5. 运行自定义任务

# 执行注册的自定义任务
hvigorw customTask# 或通过模块名指定
hvigorw ModuleName:customTask

注意事项

  1. 兼容性:确保插件与 Hvigor 版本匹配。
  2. 性能:避免在插件中执行耗时操作,以免影响构建速度。
  3. 调试:使用 hvigorw --debug 查看详细构建日志。

通过 HvigorPlugin 接口,开发者可以深度定制鸿蒙应用的构建流程,实现自动化代码检查、资源优化等高级功能。


http://www.ppmy.cn/devtools/167051.html

相关文章

Websocket的基本使用

1. WebSocket WebSocket 是一种在单个TCP连接上进行全双工通信的协议,它在现代 Web 开发和网络应用中发挥着重要作用。在 WebSocket 出现之前,实现服务器与客户端实时通信主要采用轮询Polling和长轮询Long - Polling等技术。轮询是客户端定时向服务器发…

前端构建工具进化论:从Grunt到Turbopack的十年征程

前端构建工具进化论:从Grunt到Turbopack的十年征程 一、石器时代:任务自动化工具(2012-2014) 1.1 Grunt:首个主流构建工具 // Gruntfile.js 典型配置 module.exports function(grunt) {grunt.initConfig({concat: {…

数据结构与算法:动态规划dp:子序列相关力扣题(下):392. 判断子序列、115.不同的子序列

392. 判断子序列 1.套最长公共子序列问题的板子 class Solution:def isSubsequence(self, s: str, t: str) -> bool:"""最长公共子序列长度是否len(s),是就是true,否就是falsedp[i][j]考虑以s[i-1],t[j-1]的最长公共子序…

SQLiteStudio:一款免费跨平台的SQLite管理工具

SQLiteStudio 是一款专门用于管理和操作 SQLite 数据库的免费工具。它提供直观的图形化界面,简化了数据库的创建、编辑、查询和维护,适合数据库开发者和数据分析师使用。 功能特性 SQLiteStudio 提供的主要功能包括: 免费开源,可…

条款1:理解模版性别推导

目录 问题引出 情况1&#xff1a;ParamType是个指针或引用&#xff0c;但不是个万能引用。 情况2&#xff1a;ParamType是个万能引用 情况3&#xff1a;ParamType既非指针也非引用 问题引出 函数模板大致形如&#xff1a; template<typename T> void f(ParamType p…

2025-03-13 禅修-错误的做法

摘要: 2025-03-13 禅修-错误的做法 禅修-错误的做法 我们今天的课程是这个禅修防误。主要是有一些我们所明令禁止的。在整个禅修过程中&#xff0c;会对我们禅修出现一些弊端的这部分&#xff0c;我们会给大家介绍。第一&#xff0c;在禅修中要防止自由联想&#xff0c;防止幻…

django中间件说明

Django中间件是一种在请求和响应处理过程中介入的机制&#xff0c;允许你在视图处理请求之前或之后执行自定义代码。中间件适用于处理全局性任务&#xff0c;如身份验证、日志记录、内容修改等。以下是Django中间件的详细说明和使用方法&#xff1a; 一、中间件的核心概念 作用…

OSPF-2 邻接建立关系

上一期我们说了OSPF的邻居建立关系以及OSPF邻居关系建立中建立失败的因素以及相关实验案例 这一期我们来说说OSPF的邻接关系建立时需要交互哪些报文以及失败因素及原因和相关实验案例 一、概述 在运行了OSPF的网络当中为了交互链路状态信息和路由信息,互相之间需要建立邻接关…