目錄
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
- signingConfig:簽名配置,對應build-profile.json5里的signingConfig配置項。
目前可以在模塊級的hvigorfile.ts的config.ohos中配置的字段:
- overrides:定義起覆蓋作用的字段的位置,會在構建過程中覆蓋原有的對應配置項。
- buildOption:對應build-profile.json5里的???????buildOption配置項。
- arkOptions
- externalNativeOptions
- napiLibFilterOption
- nativeLib
- resOptions
- sourceOption
- buildOption:對應build-profile.json5里的???????buildOption配置項。
配置在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. */
}
感謝各位大佬支持!!!
互三啦!!!