目录

1 -> 通过hook以及插件上下文实现动态配置

2 -> 在hvigorfile.ts中通过overrides关键字导出动态配置

3 -> 通过hook以及插件上下文动态配置构建配置

3.1 -> 修改每个hvigorNode中的build-profile.json5

3.2 -> 修改module.json5中的配置信息

3.3 -> 修改app.json5中的配置信息

3.4 -> 修改oh-package.json5中的依赖


1 -> 通过hook以及插件上下文实现动态配置

Hvigor支持stage模型在hvigor hook中操作从硬盘上读取的以下配置文件:

  • 每个hvigorNode中的build-profile.json5
  • module.json5
  • app.json5
  • 每个module下的oh-package.json5文件中的dependency、devDependency、dynamicDependency以及version。

目前可以通过hvigor对象提供的上下文直接获取和修改配置以实现动态配置构建配置、并使能到构建的过程与结果中。

在hvigorfile.ts或hvigorconfig.ts文件中,可以使用Hvigor提供的API接口来实现此能力。

相比于下面的overrides的能力来说,通过hook以及插件上下文来动态修改签名和编译配置更为灵活和易于理解,功能也更为全面,推荐使用此种方式。

2 -> 在hvigorfile.ts中通过overrides关键字导出动态配置

在hvigorfile.ts中,我们约定在导出的对象中的config.ohos属性里接收编译的配置:

export default {  system: hapTasks,  config: {  ohos: {...}    }
}

目前可以在工程级的hvigorfile.ts的config.ohos中配置的字段:

  • overrides:定义起覆盖作用的字段的位置,会在构建过程中覆盖原有的对应配置项。
    • signingConfig:签名配置,对应build-profile.json5里的signingConfig配置项。
      • type
      • material
        • certpath
        • storePassword
        • keyAlias
        • keyPassword
        • profile
        • signAlg
        • storeFile
    • appOpt:对应​​​​​​​app.json5里的配置项字段。
      • bundleName
      • bundleType
      • icon
      • label
      • vendor
      • versionCode
      • versionName

目前可以在模块级的hvigorfile.ts的config.ohos中配置的字段:

  • overrides:定义起覆盖作用的字段的位置,会在构建过程中覆盖原有的对应配置项。
    • buildOption:对应build-profile.json5里的​​​​​​​buildOption配置项。
      • arkOptions
      • externalNativeOptions
      • napiLibFilterOption
      • nativeLib
      • resOptions
      • sourceOption

配置在overrides项中的参数,其优先级会高于在配置项中的对应字段。

3 -> 通过hook以及插件上下文动态配置构建配置

3.1 -> 修改每个hvigorNode中的build-profile.json5

此处只举例为单个node注册hook并修改build-profile.json5的信息。

例如需要修改根目录下的build-profile.json5的签名信息,则在项目根目录下的hvigorfile.ts中添加如下内容:

import { appTasks, OhosAppContext, OhosPluginId } from '@ohos/hvigor-ohos-plugin';
import { hvigor,getNode } from '@ohos/hvigor'// 获取根节点
const rootNode = getNode(__filename);
// 为根节点添加一个afterNodeEvaluate hook 在hook中修改根目录下的build-profile.json5的内容并使能
rootNode.afterNodeEvaluate(node => {// 获取app插件的上下文对象const appContext = node.getContext(OhosPluginId.OHOS_APP_PLUGIN) as OhosAppContext;// 通过上下文对象获取从根目录build-profile.json5文件中读出来的obj对象const buildProfileOpt = appContext.getBuildProfileOpt();// 修改obj对象为想要的,此处举例修改app中的signingConfigsbuildProfileOpt['app']['signingConfigs'] = [{"name": "default","type": "HarmonyOS","material": {"certpath": "D:\\SigningConfig\\debug_hos.cer","storePassword": "******","keyAlias": "debugKey","keyPassword": "******","profile": "D:\\SigningConfig\\debug_hos.p7b","signAlg": "SHA256withECDSA","storeFile": "D:\\SigningConfig\\debug_hos.p12"}}];// 将obj对象设置回上下文对象以使能到构建的过程与结果中appContext.setBuildProfileOpt(buildProfileOpt);
})
export default {system: appTasks,  /* Built-in plugin of Hvigor. It cannot be modified. */plugins:[]         /* Custom plugin to extend the functionality of Hvigor. */
}

3.2 -> 修改module.json5中的配置信息

可以通过hvigor对象的hook能力快捷为所有的node创建hook,此处先举例为单一的node创建一个hook并修改其中的module.json5的配置信息。

例如此处需要修改entry下的module.json5配置,则在entry下的hvigorfile.ts中添加如下内容:

import { hapTasks, OhosHapContext, OhosPluginId } from '@ohos/hvigor-ohos-plugin';
import { getNode } from '@ohos/hvigor'const entryNode = getNode(__filename);
// 为此节点添加一个afterNodeEvaluate hook 在hook中修改module.json5的内容并使能
entryNode.afterNodeEvaluate(node => {// 获取此节点使用插件的上下文对象 此时为hap插件 获取hap插件上下文对象const hapContext = node.getContext(OhosPluginId.OHOS_HAP_PLUGIN) as OhosHapContext;// 通过上下文对象获取从module.json5文件中读出来的obj对象const moduleJsonOpt = hapContext.getModuleJsonOpt();// 修改obj对象为想要的,此处举例修改module中的deviceTypesmoduleJsonOpt['module']['deviceTypes'] = ["phone", "tablet", "2in1", "car"];// 将obj对象设置回上下文对象以使能到构建的过程与结果中hapContext.setModuleJsonOpt(moduleJsonOpt);
})
export default {system: hapTasks,  /* Built-in plugin of Hvigor. It cannot be modified. */plugins:[]         /* Custom plugin to extend the functionality of Hvigor. */
}

3.3 -> 修改app.json5中的配置信息

在项目的根目录下的hvigorfile.ts中添加如下代码内容:

import { appTasks, OhosAppContext, OhosPluginId } from '@ohos/hvigor-ohos-plugin';
import { hvigor } from '@ohos/hvigor'// 为根节点添加一个afterNodeEvaluate hook 在hook中修改app.json5的内容并使能
hvigor.getRootNode().afterNodeEvaluate(rootNode => {// 获取app插件的上下文对象const appContext = rootNode.getContext(OhosPluginId.OHOS_APP_PLUGIN) as OhosAppContext;// 通过上下文对象获取从app.json5文件中读出来的obj对象const appJsonOpt = appContext.getAppJsonOpt();// 修改obj对象为想要的,此处举例修改app中的versionCodeappJsonOpt['app']['versionCode'] = 1000001;// 将obj对象设置回上下文对象以使能到构建的过程与结果中appContext.setAppJsonOpt(appJsonOpt);
})
export default {system: appTasks,  /* Built-in plugin of Hvigor. It cannot be modified. */plugins:[]         /* Custom plugin to extend the functionality of Hvigor. */
}

3.4 -> 修改oh-package.json5中的依赖

可以通过hvigorfile.ts自定义插件修改工程级、模块级的oh-package.json5的依赖,例如在工程级hvigorfile.ts或模块级hvigorfile.ts分别添加以下内容:

// 工程级hvigorfile.ts
import { appTasks, OhosAppContext, OhosPluginId, Target } from '@ohos/hvigor-ohos-plugin';
import { HvigorNode, HvigorPlugin, TaskInput, TaskOutput } from '@ohos/hvigor';
export function customPlugin(): HvigorPlugin {return {pluginId: 'customPlugin',async apply(currentNode: HvigorNode): Promise<void> {const appContext = currentNode.getContext(OhosPluginId.OHOS_APP_PLUGIN) as OhosAppContext;const dependency = appContext.getDependenciesOpt({});  //获取dependency依赖dependency["library"]="file:library.har"console.log(dependency);appContext.setDependenciesOpt(dependency );  //修改dependency依赖}};
}
export default {system: appTasks,  /* Built-in plugin of Hvigor. It cannot be modified. */plugins:[customPlugin()]         /* Custom plugin to extend the functionality of Hvigor. */
}// 模块级hvigorfile.ts
import {hapTasks,OhosHapContext,OhosPluginId,Target} from '@ohos/hvigor-ohos-plugin';
import { hvigor, HvigorNode, HvigorPlugin} from '@ohos/hvigor';
import * as fs from 'fs';
export function customPlugin(options: OnlineSignOptions): HvigorPlugin {return {pluginId: 'customPlugin',context() {return {signConfig: options};},async apply(currentNode: HvigorNode): Promise<void> {const hapContext = currentNode.getContext(OhosPluginId.OHOS_HAP_PLUGIN) as OhosHapContext;const dependency = hapContext.getDependenciesOpt();//获取dependency依赖dependency["library"]="file:library.har"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. */
}

感谢各位大佬支持!!!

互三啦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88236.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88236.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/88236.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android View事件分发机制详解

Android 的 View 事件分发机制是处理用户触摸&#xff08;Touch&#xff09;事件的核心流程&#xff0c;它决定了触摸事件如何从系统传递到具体的 View 并被消费。理解这个机制对于处理复杂的触摸交互、解决滑动冲突至关重要。 核心思想&#xff1a;责任链模式 事件分发遵循一个…

【CMake】自定义package并通过find_package找到

在一些场景下我们需要编写一些库&#xff0c;并希望其他程序可以找到这些库并引用。 CMake采用package这个概念来解决这个问题。 关于CMake的find_package文章有很多&#xff0c;但这些文章的内容大多不直观讲了一堆讲不到点子上&#xff0c;让人看了一头雾水。因此我想通过本文…

【MATLAB例程】AOA与TDOA混合定位例程,适用于二维环境、3个锚点的定位|附代码下载链接

本 MATLAB 程序实现了基于 Angle of Arrival (AOA) 与 Time Difference of Arrival (TDOA) 的二维定位方法&#xff0c;通过自适应融合与最小二乘优化&#xff0c;实现对未知目标的高精度估计。本例中固定使用了 3 个基站&#xff08;锚点&#xff09;&#xff0c;算法框架支持…

磐维数据库panweidb集中式集群配置VIP【添加、删除和修改】

0 说明 panweidb集中式集群为了防止主备切换后应用连接无法切换到新主库&#xff0c;需要配置vip&#xff0c;应用可以只通过该ip与数据库连接&#xff0c;不用感知数据库在哪个节点上。 panweidb中配置 VIP主要依赖 CM 组件的 VIP 仲裁功能&#xff0c;通过回调脚本在主备切换…

python的保险业务管理与数据分析系统

前端开发框架:vue.js 数据库 mysql 版本不限 后端语言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 数据库工具&#xff1a;Navicat/SQLyog等都可以 保险行业…

R语言如何接入实时行情接口

目录 1. 安装必要的R包 2. 导入库 3. 连接WebSocket 4. 处理连接成功后的操作 5. 处理接收到的消息 6. 处理连接关闭和错误 7. 发送心跳数据 8. 自动重连机制 9. 启动连接和重连 总结 在数据分析和金融研究中&#xff0c;实时行情数据的获取至关重要&#xff0c;但市…

Redis数据安全性分析

Redis高可用与数据安全机制深度解析前置知识&#xff1a;Redis基础安装与使用&#xff08;主从复制、哨兵集群、Cluster集群搭建&#xff09;一、Redis性能压测工具 工具名称&#xff1a;redis-benchmark核心作用&#xff1a;快速基准测试Redis性能使用场景&#xff1a;评估不同…

差分和前缀和

差分和前缀和的原理、用法和区别。前缀和&#xff08;Prefix Sum&#xff09;核心思想&#xff1a;预处理数组的前缀和&#xff0c;快速回答「区间和查询」 适用场景&#xff1a;数组静态&#xff08;更新少、查询多&#xff09;&#xff0c;需要频繁计算任意区间的和1. 定义与…

C++并发编程-12. 用内存顺序实现内存模型

前情回顾 前文我们介绍了六种内存顺序&#xff0c;以及三种内存模型&#xff0c;本文通过代码示例讲解六种内存顺序使用方法&#xff0c;并实现相应的内存模型。全局一致性模型同步模型(获取和释放)松散模型memory_order_seq_cst memory_order_seq_cst代表全局一致性顺序&#…

AI测试革命:从智能缺陷检测到自愈式测试框架的工业实践

AI测试革命&#xff1a;从智能缺陷检测到自愈式测试框架的工业实践 希望对大家有用&#xff01; 目录AI测试革命&#xff1a;从智能缺陷检测到自愈式测试框架的工业实践希望对大家有用&#xff01;一、传统测试之殇&#xff1a;工业质检的切肤之痛二、智能缺陷检测系统架构1. …

二、深度学习——损失函数

二、损失函数损失函数定义&#xff1a;损失函数是用来衡量模型参数的质量的函数&#xff0c;衡量方式是比较网络输出和真实输出的差异别名&#xff1a;损失函数&#xff08;loss function&#xff09;&#xff0c;代价函数&#xff08;cost function&#xff09;&#xff0c;目…

面向数据报的套接字通道技术详解

数据报通道基础 通道特性与创建方式 java.nio.channels.DatagramChannel类实例代表数据报通道&#xff0c;默认处于阻塞模式。通过configureBlocking(false)方法可将其配置为非阻塞模式。创建数据报通道需调用其静态open()方法&#xff0c;若用于IP组播则需指定组播组的地址类型…

147.在 Vue3 中使用 OpenLayers 地图上 ECharts 模拟飞机循环飞行

&#x1f9e9; 效果预览 &#x1f447; 飞机从多个城市起飞并向其他城市飞行&#xff0c;动画流畅&#xff0c;地图可缩放拖拽&#xff1a; &#x1f4e6; 一、项目技术栈 技术用途Vue 3现代前端框架OpenLayers地图底图渲染ECharts ol-echarts飞机飞行动画渲染ol-echarts将 …

OCR与PDF解析的区别

我们日常所接触的文档中&#xff0c;经常能碰到多语言混合的文档。比如论文试卷、财报研报、跨国票据都含有多种语言和文字。要将文档中的内容识别并提取务必需要使用到OCR技术&#xff0c;而传统的OCR工具在处理这类型文档的时候有局限性。早期的 OCR 系统识别精度有限&#x…

Java 单例类详解:从基础到高级,掌握线程安全与高效设计

作为一名Java开发工程师&#xff0c;你一定对**单例模式&#xff08;Singleton Pattern&#xff09;**不陌生。它是23种经典设计模式中最简单也是最常用的一种&#xff0c;用于确保一个类在整个应用程序中只有一个实例存在。单例广泛应用于系统配置、数据库连接池、日志管理器、…

面向对象设计

你列出的这些属于 C 高级开发中面向对象设计与架构设计的核心知识&#xff0c;也是面试高级工程师岗位必问的内容。下面我按顺序&#xff0c;深入讲解每一项概念、原理、用途&#xff0c;并穿插 C 示例。✅ 1. 设计原则&#xff08;SOLID&#xff09;SOLID 是面向对象设计的五大…

IntelliJ IDEA让我的开发效率翻倍:从新手到高效开发者的进阶之路

IntelliJ IDEA让我的开发效率翻倍&#xff1a;从新手到高效开发者的进阶之路 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用…

css sprites使用

CSS Sprites 是一种将多个小图标或背景图像合并到一个大图中的技术。通过减少HTTP请求次数&#xff0c;可以显著提高页面加载速度。其核心原理是&#xff1a;通过设置元素的背景图&#xff08;background-image&#xff09;为这个大图&#xff0c;然后调整背景位置&#xff08;…

分布式爬虫在电商平台商品数据大规模采集中的技术应用

在电商平台商品数据大规模采集场景中&#xff0c;分布式爬虫凭借其高效、可扩展、抗风险的特性&#xff0c;成为突破单节点爬虫性能瓶颈的核心技术方案。以下从技术架构、关键技术点、电商场景适配及挑战应对四个维度&#xff0c;解析其具体应用&#xff1a;一、分布式爬虫的核…

Linux的`if test`和`if [ ]中括号`的取反语法比较 笔记250709

Linux的if test和if 中括号的取反语法比较 笔记250709 Linux的 test命令&#xff08;或等价中括号写法 [空格expression空格]&#xff09;的用法详解. 笔记250709 四种取反语法: if ! test -e xxx ;then... 和 if test ! -e xxx ;then... 和 if ! [ -e xxx ] ;then... 和 if …