news 2026/4/18 10:52:04

Hvigor 构建自动化部署脚本(二) 自定义Hvigor任务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Hvigor 构建自动化部署脚本(二) 自定义Hvigor任务

自定义任务介绍


  • 创建一个自定义任务工程,并且实现一个基础的任务流程

  • 将自定义任务注册到harmony工程中的module中并执行

1、创建自定义任务工程


  • 安装相应的nodejs与npm(可以用安装环境后默认自带的node环境)
  • 安装typescript环境(npm install -g typescript)
  • 新建一个harmony工程,并且在工程内创建两个演示module,以及一个Hvigor的plugin工程,并且在plugin目录下通过tsc --init和npm init初始化node工程,通过npm命令行安装hvigor 与 hvigor-ohos-plugin(安装前需要添加.npmrc文件,详情可参考 Hvigor 构建自动化部署脚本(一) Hvigor介绍以及使用)
    npm install @ohos/hvigor npm install @ohos/hvigor-ohos-plugin
    完成后工程目录结构为下图所示:


    我们可以直接用vscode将plugin工程打开,并且创建我们自定义任务,工程结构如下:


    自定义任务需要实现HvigorTask接口,并且实现内部的方法,接口详情如下:
export interface 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[]; }

我们主要需要实现run方法,这个是当执行到我们任务时任务的主要功能,并且声明任务处于任务链中的环节通过设置dependencies设置前置和后置依赖,下面是一个演示任务,作用于harmony工程中的module级工程,可以实现编译并且自动拷贝har包到sdk文件内

/** * 组件Har包打包导出脚本实现 */ import path from 'node:path'; import os from 'node:os'; import { HvigorTask, HvigorTaskContext, TaskInput, TaskOutput } from '@ohos/hvigor'; import fs from "fs-extra" export class ExampleTask implements HvigorTask { private harPath: string = "/build/default/outputs/default/"; constructor() { } name: string = "ExampleTask"; context?: any; run(taskContext: HvigorTaskContext) { console.log(taskContext.modulePath); function getHarInfo() { try { let res = fs.readJSONSync(path.join(taskContext.modulePath, "oh-package.json5")) return { "name": res.name, "version": res.version } } catch (e) { console.log(e); } } let harInfo = getHarInfo(); let source = path.join(taskContext.modulePath, this.harPath, harInfo!.name + ".har"); let type = ""; if (os.platform() === "win32") { type = taskContext.modulePath.replace("\\" + harInfo?.name, "") .substring(taskContext.modulePath.replace("\\" + harInfo?.name, "").lastIndexOf("\\")) } else { type = taskContext.modulePath.replace("/" + harInfo?.name, "") .substring(taskContext.modulePath.replace("/" + harInfo?.name, "").lastIndexOf("/")) } console.log("bundle", taskContext.modulePath.replace("/" + harInfo?.name, ""), "type", type); if (!fs.existsSync(path.join(taskContext.modulePath, "/sdk/", type))) { fs.mkdirSync(path.join(taskContext.modulePath, "/sdk/", type), { recursive: true }) } let dist = path.join(taskContext.modulePath, "/sdk/", harInfo!.name + "-" + harInfo?.version + ".har") console.log("开始拷贝输出文件", source, dist); fs.copyFileSync(source, dist) }; beforeRun(taskContext: HvigorTaskContext) { this.dependencies = ['default@PackageHar'] } dependencies = ['default@PackageHar'] }

2、将自定义任务注册到harmony工程中的module中并执行

在需要增加任务的module下hvigorfile.ts中增加任务注册
如下图所示:

import { harTasks } from '@ohos/hvigor-ohos-plugin'; import { ExampleTask } from "../plugin/index.ts" export function ExamplePlugin() { return { pluginId: "ExamplePlugin", apply(pluginContext) { pluginContext.registerTask(new ExampleTask()) } } } export default { system: harTasks, plugins: [ExamplePlugin()] };

注册一个任务名称为ExamplePlugin的任务,并且导出任务级别为harTasks等级,注册后可以通过命令hvigorw(windows为hvigorw.bat) --mode module -p product=default -p module=library@default ExampleTask 执行任务
执行成功后控制台显示

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:08:05

Unity 3D塔防游戏开发终极指南:从零构建专业级防御系统

想要快速掌握Unity 3D游戏开发核心技术吗&#xff1f;这个完整的塔防游戏项目将带你系统学习从场景搭建到战斗逻辑的全流程开发技能。通过实战项目&#xff0c;你将深入理解游戏引擎的工作机制和C#编程的最佳实践。 【免费下载链接】Tower-Defense-Tutorial Learn how to make …

作者头像 李华
网站建设 2026/4/17 14:06:08

呼叫中心FAQ

1、 什么叫呼叫中心&#xff1f;“呼叫中心”是公司企业为用户服务而设立的。早在80年代&#xff0c;欧美等国的电信企业、航空公司、商业银行等为了密切与用户联系&#xff0c;应用计算机的支持、利用电话作为与用户交互联系的媒体&#xff0c;设立了”呼叫中心“&#xff08;…

作者头像 李华
网站建设 2026/4/18 7:03:04

第十五届春季国际工程与技术大会 (SCET 2026)

第十五届春季国际工程与技术大会 (SCET 2026) The 15th Spring World Congress on Engineering and Technology(SCET 2026) 2026年4月17-19日 中国-西安 &#x1f4c5; 重要信息 会议官网&#xff1a;https://www.academicx.org/SCET/2026/ 会议时间&#xff1a;2026年4月1…

作者头像 李华
网站建设 2026/4/18 5:30:43

OpenAI发布GPT最新升级版本

来源&#xff1a;维度网-全球简讯 12月11日消息&#xff0c;美国开放人工智能研究中心(OpenAI)11日发布其人工智能模型GPT的最新升级版本GPT-5.2&#xff0c;以应对生成式人工智能领域日趋激烈的竞争。 为回应谷歌公司11月所发布人工智能模型双子座3的出色表现&#xff0c;Oep…

作者头像 李华
网站建设 2026/4/18 5:30:00

Chain-of-Thought Prompting(CoT, 管道模式)

提示链&#xff08;Prompt Chain&#xff09;是大语言模型&#xff08;LLM&#xff09;处理复杂任务的核心优化范式&#xff0c;其核心逻辑是 “分而治之”—— 将单一大模型难以直接驾驭的复杂任务&#xff0c;拆解为一系列独立、聚焦、可管理的子问题&#xff0c;通过专门设计…

作者头像 李华
网站建设 2026/4/17 16:15:48

2025年十大主流项目管理软件全景视图

面对数琳琅满目各具特色的项目管理软件&#xff0c;如何选择&#xff1f;深度解析十款2025年表现卓越的项目管理工具&#xff0c;找到最适合你团队的“项目管理大脑”。 1.进度猫核心定位&#xff1a;以甘特图为核心的项目进度管控独特优势&#xff1a;可视化甘特图直观清晰…

作者头像 李华