【HarmonyOS Next之旅】DevEco Studio使用指南(四十二) -> 動態修改編譯配置

目錄

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 …