顶一下,贴一个相关 Issue
1赞
感谢反馈,已经通知脚本工程师。
1赞
你提供的demo中扩展的作用是什么?
扩展自己写的,就是用命令行连续构建 10 次,核心代码是:
build() {
/** 构建次数 */
let buildTimes = 10;
/** 初始化当前次数 */
let nowTimes = 0;
/** Cocos 执行程序路径 */
let cocosPath = join(dirname(dirname(Editor.App.path)), 'CocosCreator.exe');
/** Cocos 项目路径 */
let projectPath = Editor.Project.path;
/** 命令行 */
let command = `${cocosPath} --project ${projectPath} --build "platform=web-mobile"`;
let task = () => {
exec(command, (err, stdout, stderr) => {
console.log(stdout);
if (nowTimes < buildTimes) {
nowTimes++;
task();
}
});
}
task();
}
你可以直接看源码
我临时处理了,检测日志文件,如果失败了就重新发布。一直发布到日志成功
2赞
这个是个老问题了,暂时看起来没办法解决
我们处理方法是在扩展里延时轮询assetdb有没有加载完,算是没有办法的办法
1赞
啥时候能解决!
你提供的项目在我本地无法复现问题。可以试试加setTimeOut延迟试试。
是这样得,可能项目比较庞大,我看工具打开得时候右小角在编译中,使用cmd发布就容易出现了,但是等右下角编译中转完又好了,那就是cmd发布得步骤里面缺失了。这个从哪里入手处理么!
同时编译,可能导致文件读写异常。暂时不支持并发编译。
但是我是直接命令行git拉取,然后命令行执行发布的,编辑器没打开应该不存在同时编译,还是出现脚本丢失,说明命令行里没有等脚本刷新完就执行了操作。
遇到了,挺着急的,求解决方案
试了下可以了,和你这个差不多,但多了个“等待assetdb”的步骤:
import { BuildHook, IBuildResult, ITaskOptions } from '../@types';
import { PACKAGE_NAME } from './global';
function log(...arg: any[]) {
return console.log(`[${PACKAGE_NAME}] `, ...arg);
}
function sleep(ms: number) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function queryAssetCount(): Promise<number> {
try {
const assets = await Editor.Message.request('asset-db', 'query-assets');
return Array.isArray(assets) ? assets.length : 0;
} catch (e) {
console.warn(`[${PACKAGE_NAME}] query-assets failed`, e);
return 0;
}
}
const STABLE_POLLS = 5;
const INTERVAL_MS = 3000;
const MAX_WAIT_MS = 180000;
const FINAL_DELAY_MS = 5000;
async function waitAssetDbStable(): Promise<boolean> {
let lastCount = -1;
let stable = 0;
const start = Date.now();
while (Date.now() - start < MAX_WAIT_MS) {
const count = await queryAssetCount();
log('AssetDB poll', { count, stable, STABLE_POLLS });
if (count > 0 && count === lastCount) {
stable++;
if (stable >= STABLE_POLLS) {
log('AssetDB stabilized');
return true;
}
} else {
stable = 0;
lastCount = count;
}
await sleep(INTERVAL_MS);
}
console.warn(`[${PACKAGE_NAME}] AssetDB did not stabilize within ${MAX_WAIT_MS}ms`);
return false;
}
export const onBeforeBuild: BuildHook.onBeforeBuild = async function(options: ITaskOptions, result: IBuildResult) {
const ok = await waitAssetDbStable();
if (!ok) {
await sleep(FINAL_DELAY_MS);
}
};
export const onError: BuildHook.onError = async function(options, result) {
console.warn(`${PACKAGE_NAME} run onError`);
try {
const count = await queryAssetCount();
console.warn(`[${PACKAGE_NAME}] onError asset count: ${count}`);
} catch {}
};
亲测有效,大佬辛苦!
亲测有效,大佬辛苦,waitAssetDbStable这个返回true,也有时会打包失败,直接暴力等待一个了时间
亲测有效,感谢大佬
query-assets 这个没办法保证构建成功,最好是根据构建日志来判断是否失败,然后等待一段时间后重试,重试也要加次数,有可能一直失败
我也遇到了。反正就是一直打包,直到成功
