【hvigor专栏】OpenHarmony应用开发-hvigor插件之动态修改应用hap文件名

前言

在OpenHarmony应用开发中,动态修改应用hap文件名是较为常见的功能,比如文件名包含版本号、构建时间、编译模式等等。下文会以一个完整的示例为大家讲述如何实现此功能。

开发环境

DevEco Studio: DevEco Studio 6.0.0 Release(Build Version: 6.0.0.858)

开发流程

前置步骤

  1. 创建新工程。

  2. 编译工程,可以看到build/default/outputs/default/目录下生成了名为entry-default-unsigned.hap的默认hap。

新增artifactName

entry模块的build-profile.json5下新增

json 复制代码
{
  ···
  "targets": [
    {
      "name": "default",
      ···
      "output": {
        "artifactName": "samples"
      }
    }
  ]
}

新增hvigor任务

在根目录hvigorfile.ts里修改为以下代码

ts 复制代码
import { appTasks, OhosAppContext, OhosHapContext, OhosPluginId } from '@ohos/hvigor-ohos-plugin';
import { hvigor } from '@ohos/hvigor';

// 动态修改应用hap文件名
export function dynamicChangeNamePlugin(): HvigorPlugin {
  return {
    pluginId: 'dynamicChangeNamePlugin',
    context() {
      return {
        data: 'modify output name'
      };
    },
    async apply(currentNode: HvigorNode): Promise<void> {
      // 获取app插件的上下文对象
      const appContext = currentNode.getContext(OhosPluginId.OHOS_APP_PLUGIN) as OhosAppContext;
      // 通过上下文对象获取从根目录build-profile.json5文件中读出来的obj对象
      const buildProfileOpt = appContext.getBuildProfileOpt();
      const appJsonOpt = appContext.getAppJsonOpt();
      // 修改obj对象为想要的,此处举例修改app中的signingConfigs
      const products = buildProfileOpt.app.products;
      let date = new Date();
      let formatDate = date.getFullYear().toString() + (date.getMonth() + 1).toString().padStart(2, '0') +
      date.getDate().toString().padStart(2, '0') + '_' + date.getHours().toString().padStart(2, '0') +
      date.getMinutes().toString().padStart(2, '0') + date.getSeconds().toString().padStart(2, '0');
      for (const product of products) {
        if (product.name == 'default') {
          product.output.artifactName = formatDate + '_' + appJsonOpt.app.versionName + '_' +
          product.output.artifactName + '_' + appContext.getBuildMode();
          console.info(`output app name: ${product.output.artifactName}`);
        }
      }
      // 将obj对象设置回上下文对象以使能到构建的过程与结果中
      appContext.setBuildProfileOpt(buildProfileOpt);
      hvigor.nodesEvaluated(async () => {
        currentNode.subNodes((node: HvigorNode) => {
          // 获取hpp插件的上下文对象
          const hapContext = node.getContext(OhosPluginId.OHOS_HAP_PLUGIN) as OhosHapContext;
          // 通过上下文对象获取从根目录build-profile.json5文件中读出来的obj对象
          const hapBuildProfileOpt = hapContext?.getBuildProfileOpt();
          if (hapBuildProfileOpt != undefined) {
            const targets = hapBuildProfileOpt['targets'];
            for (const target of targets) {
              if (target.name == 'default' && target.output?.artifactName != undefined) {
                target.output.artifactName = formatDate + '_' + appJsonOpt.app.versionName + '_' +
                target.output.artifactName + '_' + appContext.getBuildMode();
                console.info(`output hap name: ${target.output?.artifactName}`);
              }
            }
            hapContext.setBuildProfileOpt(hapBuildProfileOpt);
          }
        })
      })
    }
  }
}

export default {
  system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */
  plugins: [
    dynamicChangeNamePlugin()
  ]       /* Custom plugin to extend the functionality of Hvigor. */
}

编译验证

  1. 编译工程,可以看到build/default/outputs/default/目录下生成了名为20251117_113634_1.0.0_samples_debug-unsigned.hap的自定义文件名hap,其中包含了构建时间、版本号、自定义产物名、编译模式、是否签名等信息。

注意事项

  1. 如果自定义文件名里包含了时间规则,那么因为时间的变化,每次打出的hap都不会覆盖前一个,而是会创建一个新的,从而导致hap越来越多,本地工程体积越来越大。
相关推荐
benbenAItalk几秒前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
2601_9628857220 分钟前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
西瓜太郎12341 小时前
Claude Code、Codex CLI、Gemini CLI 能否共用一枚 Key?先看协议选择矩阵
前端·api 网关·claude code·gemini cli·codex cli
陈随易3 小时前
在Finch用了62亿词元,我认为这是新一代Agent工具之神
前端·人工智能·后端
水域安全老周3 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
计算机魔术师4 小时前
Anthropic CEO突然喊踩刹车,OpenAI罕见力挺:AI这辆车不能只踩油门了
前端
wing984 小时前
从codex转战workbuddy使用一周的感受
前端·人工智能·后端
EatFan4 小时前
Java接入支付宝 JSAPI 支付保姆教程(二):流程讲解与前后端代码讲解
前端·spring boot·后端·微信小程序·小程序·uni-app
梦想平凡5 小时前
百游棋牌源代码开发搭建教程(五):房间创建、座位分配与请求幂等实现
前端·javascript·数据库·源代码管理
IT_陈寒5 小时前
Redis的Set操作居然能把我的服务整挂了?
前端·人工智能·后端