【鸿蒙】工程打包-如何动态配置打包产物名称

43 阅读1分钟

分享一个在编译打hap包的时候可以动态配置打包产物名称的方法, 可以节约掉需要手动修改产物名称的时间

修改Hap的产物名称

image.png 需要在entry模块的hvigorfile.ts配置文件中, 添加以下代码

image.png

参考代码:

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文件中添加以下代码

image.png

参考代码:

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. */
}

效果如下:

image.png

如有动态配置多包产物的需求, 也可以在官方文档中找到相应的例子

官方文档参考:

developer.huawei.com/consumer/cn…