【HarmonyOS Next之旅】DevEco Studio使用指南(四十二) -> 动态修改编译配置_harmonyos next 动态配置签名
目录
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中的signingConfigs buildProfileOpt[\'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中的deviceTypes moduleJsonOpt[\'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中的versionCode appJsonOpt[\'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.tsimport { 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 { 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.tsimport {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 { 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. */}
感谢各位大佬支持!!!
互三啦!!!