自定义构建流程

我希望在按照构建面板的设定在构建之前动态添加某些资源和代码:

export const onBeforeBuild: BuildHook.onBeforeBuild = async function (options: ITaskOptions, result: IBuildResult) {
    const pkgOptions = options.packages[PACKAGE_NAME];
    log('onBeforeBuild', pkgOptions);

    if (pkgOptions['poco_enabled']) {
        // 获得poco 资源路径
        let pocoSourcePath = path.join(Editor.Project.path, 'opt_assets', 'poco');
        log(`[${PACKAGE_NAME}] poco source path: ${pocoSourcePath}`);

        let pocoTargetPath = path.join(Editor.Project.path, 'assets', 'scripts');
        log(`[${PACKAGE_NAME}] poco target path: ${pocoTargetPath}`);
        // 拷贝pocoSourcePath到pocoTargetPath
        Editor.Utils.File.copy(path.join(pocoSourcePath, 'Poco'), path.join(pocoTargetPath, 'Poco'));
        Editor.Utils.File.copy(path.join(pocoSourcePath, 'Poco.meta'), path.join(pocoTargetPath, 'Poco.meta'));
        // await Editor.Message.request('asset-db', 'query-ready');
        await Editor.Message.send('asset-db', 'refresh-asset', 'db://assets');
    } else {
        Editor.Utils.File.trashItem(path.join(Editor.Project.path, 'assets', 'scripts', 'Poco'));
        Editor.Utils.File.trashItem(path.join(Editor.Project.path, 'assets', 'scripts', 'Poco.meta'));
        // 刷新资源库
        // await Editor.Message.request('asset-db', 'query-ready');
        await Editor.Message.send('asset-db', 'refresh-asset', 'db://assets');
    }
};

但是我发现第一次执行,资源会被锁定,Poco目录并不会被打包。去除 Poco 时,部分代码资源依然被执行。
有什么方式可以让第一遍也不报错呢?

是不是跟"构建中,锁定资源操作…"有关?

手册上说,不是应该能等 await 的异步完了之后再继续嘛?
拷贝的资源进来,我想让新的资源被 creator自动导入了再继续,有办法吗?

不用编辑器扩展的方式实现, 比如先拷贝文件再启动构建

那肯定是可以的。就是想把 cocos 提供的编辑器扩展功能发挥发挥。

找到了解决办法:
因为它本身就是async异步函数,那么在调整完资源之后,用Editor.Message.send(‘asset-db’, ‘refresh-asset’, ‘db://assets’);刷新一下,然后用自己的方法延迟一下,对该方法进行异步返回,比如我用 rxjs 的 timer 进行延迟返回:

import { lastValueFrom, timer } from 'rxjs';

export const onBeforeBuild: BuildHook.onBeforeBuild = async function (options: ITaskOptions, result: IBuildResult) {
    const pkgOptions = options.packages[PACKAGE_NAME];
    log('onBeforeBuild', pkgOptions, result);

    if (pkgOptions['poco_enabled']) {
        // 获得poco 资源路径
        let pocoSourcePath = path.join(Editor.Project.path, 'opt_assets', 'poco');
        log(`[${PACKAGE_NAME}] poco source path: ${pocoSourcePath}`);
        let pocoTargetPath = path.join(Editor.Project.path, 'assets', 'scripts');
        log(`[${PACKAGE_NAME}] poco target path: ${pocoTargetPath}`);
        // 拷贝pocoSourcePath到pocoTargetPath
        Editor.Utils.File.copy(path.join(pocoSourcePath, 'Poco'), path.join(pocoTargetPath, 'Poco'));
        Editor.Utils.File.copy(path.join(pocoSourcePath, 'Poco.meta'), path.join(pocoTargetPath, 'Poco.meta'));
        Editor.Message.send('asset-db', 'refresh-asset', 'db://assets');
        await lastValueFrom(timer(1000));
    } else {
        Editor.Utils.File.trashItem(path.join(Editor.Project.path, 'assets', 'scripts', 'Poco'));
        Editor.Utils.File.trashItem(path.join(Editor.Project.path, 'assets', 'scripts', 'Poco.meta'));
        // 刷新资源库
        Editor.Message.send('asset-db', 'refresh-asset', 'db://assets');
        await lastValueFrom(timer(1000));
    }
};

这样,就能发现它打包的时候,出现"构建中,锁定资源操作…"之前,资源就是代码所调整之后的了。
检查打包后的结果,也符合预期。