分享一个在编译打hap包的时候可以动态配置打包产物名称的方法, 可以节约掉需要手动修改产物名称的时间
修改Hap的产物名称
需要在entry模块的hvigorfile.ts配置文件中, 添加以下代码
参考代码:
import { hapTasks, OhosHapContext, OhosPluginId } from '@ohos/hvigor-ohos-plugin';
import { hvigor, getNode } from '@ohos/hvigor'
const entryNode = getNode(__filename);
// 为此节点添加一个afterNodeEvaluate hook 在hook中修改build-profile.json5的内容并使能
entryNode.afterNodeEvaluate(node => {
// 获取此节点使用插件的上下文对象 此时为hap插件 获取hap插件上下文对象
const hapContext = node.getContext(OhosPluginId.OHOS_HAP_PLUGIN) as OhosHapContext;
//获取app插件的上下文对象
const appContext = hvigor.getRootNode().getContext(OhosPluginId.OHOS_APP_PLUGIN) as OhosAppContext
//通过上下文对象获取从app.json5文件中读出来的obj对象
const appJsonOpt = appContext.getAppJsonOpt();
// 通过上下文对象获取从根目录build-profile.json5文件中读出来的obj对象
const buildProfileOpt = hapContext.getBuildProfileOpt();
// 通过获取到的app配置对象拿到包名,版本号,和版本名
const bundleName = appJsonOpt["app"]["bundleName"
// const versionCode = appJsonOpt["app"]["versionCode"]
const versionName = appJsonOpt["app"]["versionName"]
//拿到products数组
const targetsList = buildProfileOpt["targets"]
//配置统一的打包出来的名称,格式为:{包名}_v{版本名}_{版本号}_{时间戳}
const timestamp = Math.floor(Date.now() / 1000)
for (const target of targetsList) {
target["output"] = target["output"] ?? {}
target["output"]["artifactName"] = `${bundleName}_v${versionName}_${timestamp}`
}
//将buildProfileOpt对象设置回上下文对象以使能到构建的过程与结果中
hapContext.setBuildProfileOpt(buildProfileOpt);
})
export default {
system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */
plugins: [] /* Custom plugin to extend the functionality of Hvigor. */
}
修改App包的产物名称
如果需要修改打包成app的产物名称, 需要在项目的根目录中的hvigorfile.ts文件中添加以下代码
参考代码:
import { appTasks, OhosAppContext, OhosPluginId } from '@ohos/hvigor-ohos-plugin';
import { hvigor } from '@ohos/hvigor'
// 为根节点添加一个afterNodeEvaluate hook 在hook中修改build-profile.json5的内容并使能
hvigor.getRootNode().afterNodeEvaluate(rootNode => {
//获取app插件的上下文对象
const appContext = rootNode.getContext(OhosPluginId.OHOS_APP_PLUGIN) as OhosAppContext
//通过上下文对象获取从app.json5文件中读出来的obj对象
const appJsonOpt = appContext.getAppJsonOpt();
// 通过上下文对象获取从根目录build-profile.json5文件中读出来的obj对象
const buildProfileOpt = appContext.getBuildProfileOpt();
// 通过获取到的app配置对象拿到包名,版本号,和版本名
const bundleName = appJsonOpt["app"]["bundleName"]
// const versionCode = appJsonOpt["app"]["versionCode"]
const versionName = appJsonOpt["app"]["versionName"]
//拿到products数组
const productsList = buildProfileOpt["app"]["products"]
//配置统一的打包出来的名称,格式为:{包名}_v{版本名}_{版本号}_{时间戳}
const timestamp = Math.floor(Date.now() / 1000)
for (const product of productsList) {
product["output"] = product["output"] ?? {}
product["output"]["artifactName"] = `${bundleName}_v${versionName}_${timestamp}`
}
//将buildProfileOpt对象设置回上下文对象以使能到构建的过程与结果中
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. */
}
效果如下:
如有动态配置多包产物的需求, 也可以在官方文档中找到相应的例子
官方文档参考: