如何在构建任务中执行shell脚本
=================

#### 场景一

只在模块中调用shell脚本，在模块的hvigorfile.ts文件中执行如下示例：

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/20/v3/qsVGDuieQLWnEZpquXYN7w/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260709T134355Z&HW-CC-Expire=86400&HW-CC-Sign=97BEDB98E59A52110B9281C82E36339D4D959E07F95080425FAD7873D0286C56)

需要特别注意system字段的取值，不同的模块需要使用不同的值：

1.  在har模块的hvigorfile.ts中，需要使用system: harTasks。
2.  在hsp模块的hvigorfile.ts中，需要使用system: hspTasks。
3.  在hap模块的hvigorfile.ts中，需要使用system: hapTasks。

_// 模块级hvigorfile.ts文件_
import { harTasks } from '@ohos/hvigor-ohos-plugin';
import { exec } from 'node:child\_process';
import util from 'node:util';
const scriptPath = 'xxxx.bat';
_// 实现自定义插件_
export function customPluginFunction2(str?: string) {
  return {
    pluginId: 'CustomPluginID2',
    apply(pluginContext) {
      pluginContext.registerTask({
       _// 在模块上注册任务_
        name: 'customTask2',
        run: (taskContext) => {
          console.log('run into: ');
          const execPromise = util.promisify(exec)
          execPromise(scriptPath).then(res => {
            console.log(res, 'res');
          }).catch(err => {
            console.log(err, 'err');
          })
        },
        _// 配置前置任务依赖_
        dependencies: \['default@BuildJS'\],
	_// 配置任务的后置任务依赖_
        postDependencies: \['default@CompileArkTS'\]
      })
    }
  }
}
export default {
  _// Hvigor插件任务类型，具体请查看最后的说明内容_
  system: harTasks,
  _// 用于扩展Hvigor功能的自定义插件_
  plugins: \[customPluginFunction2()\]
}

#### 场景二

如果多个模块的shell脚本是共用的，可以在工程级的hvigorfile.ts中调用：

_// 工程级hvigorfile.ts文件_
import { hvigor, HvigorNode, HvigorPlugin } from '@ohos/hvigor';
import { appTasks } from '@ohos/hvigor-ohos-plugin';
import { exec } from 'node:child\_process';
import util from 'node:util';
const scriptPath = 'xxxx.bat';
_// 实现自定义插件_
export function customPluginFunction1(): HvigorPlugin {
  return {
    pluginId: 'CustomPluginID1',
    async apply(currentNode: HvigorNode): Promise<void> {
      hvigor.nodesEvaluated(async () => {
        _// 注册模块级任务_
        hapTask(currentNode);
      });
    }
  };
}
function hapTask(currentNode: HvigorNode) {
  _// 遍历所有子模块节点_
  currentNode.subNodes((node: HvigorNode) => {
    _// 在每个子模块上注册任务_
    node.registerTask({
      name: 'customTask1',
      run: (taskContext) => {
        console.log('run into: ', taskContext.moduleName);
        const execPromise = util.promisify(exec);
        execPromise(scriptPath).then(res => {
          console.log(res, 'res');
        }).catch(err => {
          console.log(err, 'err');
        })
      },
	  _// 配置前置任务依赖_
	  dependencies: \['default@BuildJS'\],
	  _// 配置任务的后置任务依赖_
	  postDependencies: \['default@'\]
    });
  });
}
export default {
  _// 任务类型，不可修改_
  system: appTasks,
  _// 用于扩展Hvigor功能的自定义插件_
  plugins: \[customPluginFunction1()\]
};