【鸿蒙实战开发】基于hvigor插件定制构建

100 篇文章 1 订阅
100 篇文章 3 订阅

场景描述

在编译构建的过程中如何插入使用者需要的自定义构建任务,使用者可以通过什么方式获取扩展编译构建参数从而在运行时获取自定义的参数以及自定义修改编译产物属性。

能力说明

hvigor-ohos-plugin插件支持在hvigorfile.ts里插入使用者的自定义构建任务,并且在运行时获取到自定义的一些编译参数,以及实现修改产物属性的功能。

一、 构建生命周期以及任务流程

1.构建生命周期

hvigor有三个不同的阶段,分为初始化、配置和执行,hvigor会按顺序运行这些阶段。

初始化*:

1. 根据命令参数和hvigor-config.json5文件中的配置,设置hvigor的构建参数,并构造出hvigor对象,此对象贯穿整个hvigor生命周期,从最开始创建出来一直到此次构建结束才被销毁。
2. 通过项目根目录下的build-profile.json5文件,创建出rootNodeDescriptor实例,并通过其中的modules字段,来初始化出工程中所有模块的NodeDescriptor对象实例。
3. 执行项目根目录下的hvigorconfig.ts文件,可以在此文件中通过hvigor的相关API来为生命周期注册hook或在构建开始时进行其他处理。
4. 构造出每个节点的HvigorNode对象实例。

配置:

1. 执行每个node中的hvigorfile.ts文件,为每个node添加plugin,执行plugin的apply方法,并添加plugin的上下文。
2. 根据前一步加载出的plugin和task,构造出DAG图。

hvigor在执行任何任务之前会构建任务依赖图,所有任务会形成一个有向无环图(DAG),如下示例图,任务之间的依赖关系用箭头进行表示:

执行:

1. 执行选定的任务。
2. 任务之间的依赖关系决定了任务执行顺序。
3. 任务可以并行执行。

2.HAP基础任务流程

二、 获取自定义参数:

方式1(生成BuildProfile类文件):

HAP/HSP运行时获取编译构建参数

生成BuildProfile类文件

当前有以下几种方式可以生成BuildProfile类文件:

选中需要编译的模块,在菜单栏选择“Build > Generate Build Profile ${moduleName}”。

在菜单栏选择“Build > Build Hap(s)/APP(s) > Build Hap(s)”或“Build > Build Hap(s)/APP(s) > Build APP(s)”

生成BuildProfile类文件后,在代码中可以通过如下方式引入该文件:

  1. import BuildProfile from’BuildProfile’;

  2. 通过如下方式获取到构建参数:

    @State message: string = BuildProfile.BUNDLE_NAME;

  3. 默认参数

    生成BuildProfile类文件时,Hvigor会根据当前工程构建的配置信息生成一部分默认参数,开发者可以在代码中直接使用。

表1

参数名类型说明
BUNDLE_NAMEstring应用的Bundle名称。
BUNDLE_TYPEstring应用的Bundle类型。
VERSION_CODEnumber应用的版本号。
VERSION_NAMEstring应用版本号的文字描述。
TARGET_NAMEstringTarget名称。
PRODUCT_NAMEstringProduct名称。
BUILD_MODE_NAMEstring编译模式。
DEBUGboolean应用是否可调试。
  1. 自定义参数

开发者可以在模块级的build-profile.json5文件中增加自定义参数,在生成BuildProfile类文件后,在代码中使用自定义参数。

自定义参数可以在buildOption、buildOptionSet、targets节点下的arkOptions子节点中通过增加buildProfileFields字段实现,自定义参数通过key-value键值对的方式配置,其中value取值仅支持number、string、boolean类型。

方式2(hvigor API):

getBuildMode: () => string==>通过该方法获取编译模式(相关文档简单给出一些API)

const node = getNode(__filename);

const appContext = node.getContext(OhosPluginId.OHOS_APP_PLUGIN) as OhosAppContext;

const buildMode = appContext.getBuildMode();

console.log(buildMode);

另外也提供了相关获取扩展参数的 API :示例:getExtParams4.1.2+ ==>获取全部的-p扩展参数对象。

getExtParams(): Record<string, string> =>命令行中所有配置的-p参数集合对象

import { hvigor } from '@ohos/hvigor';

const extParams = hvigor.getParameter().getExtParams();

console.log(extParams['key']);

// 执行命令./hvigorw --sync -p key=hello,控制台打印:hello

三、 修改打包产物属性

hvigor-ohos-plugin插件支持在hvigorfile.ts里接收部分编译配置,以实现动态配置构建配置、并使能到构建的过程与结果中。

在hvigorfile.ts中,我们约定在导出的对象中的config.ohos属性里接收编译的配置,配置在overrides项中的参数,其优先级会高于在配置项中的对应字段。

工程级

appOpt:对应app.json5里的配置项字段。bundleName, bundleType, icon, label, vendor, versionCode, versionName

模块级

buildOption:对应build-profile.json5里的buildOption配置项。

arkOptions, externalNativeOptions, napiLibFilterOption, nativeLib,resOptions, sourcOption.

方法一:通过overrides动态修改配置项中的参数

export default {

system: appTasks,

plugins: [],

config: {

ohos: {

overrides:{

appOpt: {

versionCode: getVersionCode(),

versionName: getVersionName(),

icon: getIcon()

} //app.json中的内容

}

}

}

}

function getVersionCode() {

// return 100000+Date.now().getYear();

return 1;

}

function getVersionName() {

// return `1.0.0${Date.now().getTime()}`;

return "2";

}

function getIcon() {

// return 100000+Date.now().getYear();

// return "C:\\Users\\xxx\\DevEcoStudioProjects\\DemoHvigorFile\\AppScope\\resources\\base\\media\\app_icon.png";

return "C:\\Users\\xxx\\DevEcoStudioProjects\\DemoHvigorFile\\AppScope\\resources\\base\\media\\huawei.png";

}

export default {

system: appTasks,

plugins:[customPlugin()]

};

方法二:通过hvigor API 去修改

通过odesEvaluated hook获取插件向node中注册的context,然后通过这个context操作一些任务.

首先根据hvigorfile.ts路径获取当前节点->getNode(__filename),

然后根据pluginId获取当前节点上指定插件的上下文接口信息->getContext(),

获取当前构建指定的BuildMode ->getBuildMode(),

最后根据编译模式去修改app.json5里的配置项字段从而修改产物属性.

import { appTasks, OhosPluginId, OhosAppContext } from '@ohos/hvigor-ohos-plugin';

import { hvigor, getNode } from '@ohos/hvigor';

hvigor.nodesEvaluated(() => {

const node = getNode(__filename);

const appContext = node.getContext(OhosPluginId.OHOS_APP_PLUGIN) as OhosAppContext;

const buildMode = appContext.getBuildMode();

console.log(buildMode);

console.log('projectName:', appContext.getProjectName());

const appJson5 = appContext.getAppJsonOpt();

if (appContext.getBuildMode() === 'debug') {

appJson5.app.versionName = '1.0.0';

} else {

appJson5.app.versionName = '1.0.1';

}

appContext.setAppJsonOpt(appJson5);

});

export default {

system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */

plugins:[] /* Custom plugin to extend the functionality of Hvigor. */

}

四、自定义构建任务

通过在hvigorfile.ts里插入自定义任务。

首先在hvigorfile.ts文件中只需定义一个pluginId(任务Id)和name(任务名称),并实现其中的run方法,即可创建一个任务,

然后当前node节点添加插件并执行插件的apply方法,然后调用接口pluginContext中的registerTask方法,在此方法中去编写自定义任务,设置任务名称,

实现其中的run方法如下demo打印任务名称,模块名称moduleName,模块的绝对路径modulePath,

最后在设置任务插入执行流程的位置.

import { hapTasks } from '@ohos/hvigor-ohos-plugin';

export function customPluginFunction1(str?: string) {

return {

pluginId: 'CustomPluginID1',

apply(pluginContext) {

//注册自定义任务 接口pluginContext 方法registerTask

pluginContext.registerTask({

// 编写自定义任务

name: 'customTask1',

run: (taskContext) => {

// taskContext.moduleName;

// taskContext.modulePath;

//接口 taskContext 模块名称 moduleName 模块的绝对路径 modulePath

console.log('customTask1: ',taskContext.moduleName, taskContext.modulePath);

},

// 确认自定义任务插入位置

dependencies: ['default@BuildJS'],

postDependencies: ['default@CompileArkTS']

})

}

}

}

export function customPluginFunction2(str?: string) {

return {

pluginId: 'CustomPluginID2',

apply(pluginContext) {

pluginContext.registerTask({

name: 'customTask2',

run: (taskContext) => {

console.log('customTask2: ',taskContext.moduleName, taskContext.modulePath);

},

dependencies: ['default@BuildJS'],

postDependencies: ['default@CompileArkTS']

})

}

}

}

export function customPluginFunction3(str?: string) {

return {

pluginId: 'CustomPluginID3',

apply(pluginContext) {

pluginContext.registerTask({

name: 'customTask3',

run: (taskContext) => {

console.log('customTask3: ',taskContext.moduleName, taskContext.modulePath);

},

dependencies: ['customTask1'],

postDependencies: ['customTask2']

})

}

}

}

export default {

system: hapTasks, // Hvigor内置插件,不可修改

plugins: [customPluginFunction1(), customPluginFunction2(),customPluginFunction3()] // 自定义插件

}

定制任务插入位置效果:

鸿蒙全栈开发全新学习指南

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以要有一份实用的鸿蒙(HarmonyOS NEXT)学习路线与学习文档用来跟着学习是非常有必要的。

针对一些列因素,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

本路线共分为四个阶段

第一阶段:鸿蒙初中级开发必备技能

在这里插入图片描述

第二阶段:鸿蒙南北双向高工技能基础:gitee.com/MNxiaona/733GH

在这里插入图片描述

第三阶段:应用开发中高级就业技术

第四阶段:全网首发-工业级南向设备开发就业技术:gitee.com/MNxiaona/733GH

在这里插入图片描述

《鸿蒙 (Harmony OS)开发学习手册》(共计892页)

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

开发基础知识:gitee.com/MNxiaona/733GH

1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……

在这里插入图片描述

基于ArkTS 开发

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

在这里插入图片描述

鸿蒙开发面试真题(含参考答案):gitee.com/MNxiaona/733GH

在这里插入图片描述

鸿蒙入门教学视频:

美团APP实战开发教学:gitee.com/MNxiaona/733GH

写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请移步前往小编:gitee.com/MNxiaona/733GH

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值