合作咨询
我们的专家服务团队将竭诚为您提供专业的合作咨询服务
在进行编译构建的过程中,开发者可以通过定制hvigor插件,扩展构建逻辑,实现个性化的打包流程。
定制hvigor插件,通常有以下目的:
每个项目可能有独特的构建需求和流程,定制插件可以根据项目的具体要求来扩展hvigor构建的功能。
定制插件可以将某些复杂的构建逻辑封装在同一个地方,使得项目的构建配置更加清晰和易于维护。可以自动化执行某些特定任务,减少手动干预,确保构建过程的一致可靠。
在团队开发中,定制插件可以确保所有团队成员使用相同的构建流程和标准,减少因个人配置差异导致的问题,从而提升团队协作的效率。
具体到应用场景上,定制插件可以根据不同的构建需求调整编译产物属性,从而实现灵活的构建管理。
本文以自定义编译产物的文件名及路径为案例来介绍如何定制hvigor插件。
定制hvigor插件开发时,涉及以下概念:
定制hvigor插件,就是在编译构建的过程中插入开发者需要的自定义任务,将这些自定义任务抽象后封装成可复用的部分,通过输出plugin插件的目标形式,实现编译构建个性化逻辑的复用和共享分发。

如上图所示,hvigor插件的工作原理:
hvigor主要提供了两种方式以实现插件的开发:
两种方式的核心逻辑实现类似,都是以TS文件编写Task任务方法,区别主要在共享和应用方式上。
二者对比如下:
插件项目 | 代码开发 | 共享方式 | 插件使用 | 特点总结 | |
|---|---|---|---|---|---|
基于hvigorfile脚本 | 不创建项目 | 直接编辑工程/模块中hvigorfile.ts文件 | 不发布,复制代码实现共享 | 代码逻辑直接应用于编辑工程/模块 | 开发使用快速;共享复用不方便 |
基于typescript项目 | 新建npm项目 | 新建custom-plugin.ts文件 | npm打包发布共享,或离线包共享 | hvigor-config.json5中配置插件依赖,或安装离线包 | 易于分发、共享和维护;发布使用流程相对多 |
下文的场景实例采用基于typescript项目开发的方法描述,开发者也可以将插件逻辑代码直接写于hvigorfile.ts中,切换为基于hvigorfile脚本开发的实现方式。
定制hvigor插件涉及的相关能力,可查阅扩展构建API。
场景描述
以名为library的module生成HAR包为例,默认情况下,HAR包编译产物的生成路径在library/build/default/outputs/default目录下,文件名为library.har。
而开发者在用于生产的环境中,可能需要根据项目情况,使编译产物输出到指定路径,并更改其文件名,例如:带有版本号的文件名,或带有开发者名称等信息的文件名。
下面示例中用oh-package.json5中配置的属性修改HAR包文件名,同时将生成路径改为library/build/default/outputs/target。
开发步骤
插件代码示例如下:
- import fs from 'fs';
- import path from 'path';
-
- interface OhPackage {
- name: string;
- version: number;
- description: string;
- author: string;
- }
-
- export function renameHarTask(str?: string) {
- return {
- pluginId: 'RenameHarTaskID',
- apply(pluginContext) {
- pluginContext.registerTask({
- // Write custom tasks
- name: 'renameHarTask',
- run: (taskContext) => {
- // Read oh-package.json5 and parse the version
- const packageFile = path.join(taskContext.modulePath, 'oh-package.json5');
- let fileContent = fs.readFileSync(packageFile, 'utf8');
- const content: OhPackage = JSON.parse(fileContent);
- const version = content.version;
- const author = content.author;
- const sourceFile = path.join(taskContext.modulePath, 'build/default/outputs/default', `${taskContext.moduleName}.har`);
- const targetPath = path.join(taskContext.modulePath, 'build/default/outputs/target');
- const targetFile = path.join(targetPath, `${taskContext.moduleName}-${version}-${author}.har`);
-
- // Create Directory
- fs.mkdir(targetPath, { recursive: true }, (err) => {
- if (err) {
- throw err;
- }
- // Move and modify product file names
- fs.rename(sourceFile, targetFile, (err) => {
- });
- });
- },
- // Confirm custom task insertion position
- dependencies: ['default@PackageHar'],
- postDependencies: ['assembleHar']
- })
- }
- }
- }
- import { harTasks } from '@ohos/hvigor-ohos-plugin';
- import { renameHarTask } from '@bpta/custom_plugin';
-
- export default {
- system: harTasks, /* Built-in plugin of Hvigor. It cannot be modified. */
- plugins: [renameHarTask()] /* Custom plugin to extend the functionality of Hvigor. */
- }
