diff --git a/src/core/builder/@types/protected/options.ts b/src/core/builder/@types/protected/options.ts
index 57a0bb5a..4b32f9ce 100644
--- a/src/core/builder/@types/protected/options.ts
+++ b/src/core/builder/@types/protected/options.ts
@@ -375,6 +375,7 @@ export const enum BuildExitCode {
BUILD_FAILED = 34,
BUILD_SUCCESS = 0,
BUILD_BUSY = 37,
+ STATIC_COMPILE_ERROR = 38,
UNKNOWN_ERROR = 50,
}
diff --git a/src/core/builder/error-map.ts b/src/core/builder/error-map.ts
index ac4dc8a2..82041f39 100644
--- a/src/core/builder/error-map.ts
+++ b/src/core/builder/error-map.ts
@@ -5,6 +5,7 @@ const BuildErrorMap = {
[BuildExitCode.BUILD_FAILED]: '构建失败,请参考错误日志排查错误原因',
[BuildExitCode.PARAM_ERROR]: '构建参数错误,请参考错误日志调整构建参数后重试',
[BuildExitCode.UNKNOWN_ERROR]: '未知错误,请联系 cocos 官方',
+ [BuildExitCode.STATIC_COMPILE_ERROR]: '静态编译检查失败,发现 assets 相关的 TypeScript 错误',
};
export default BuildErrorMap;
\ No newline at end of file
diff --git a/src/core/builder/index.ts b/src/core/builder/index.ts
index b18a98c2..c912957a 100644
--- a/src/core/builder/index.ts
+++ b/src/core/builder/index.ts
@@ -90,7 +90,12 @@ export async function build
(platformTmp: P, options?: IBuild
const duration = formatMSTime(Date.now() - startTime);
newConsole.error(error);
newConsole.buildComplete(platform, duration, false);
- return { code: BuildExitCode.BUILD_FAILED, reason: 'Build failed! ' + String(error) };
+ // 如果错误对象包含 code 属性,使用该错误码(如 500)
+ let errorCode = error?.code && typeof error.code === 'number' ? error.code as BuildExitCode : BuildExitCode.BUILD_FAILED;
+ if (errorCode === BuildExitCode.BUILD_SUCCESS) {
+ errorCode = BuildExitCode.BUILD_FAILED;
+ }
+ return { code: errorCode as Exclude, reason: error?.message || String(error) };
}
}
diff --git a/src/core/builder/worker/builder/asset-handler/script/index.ts b/src/core/builder/worker/builder/asset-handler/script/index.ts
index ad0524f3..e873cfa8 100644
--- a/src/core/builder/worker/builder/asset-handler/script/index.ts
+++ b/src/core/builder/worker/builder/asset-handler/script/index.ts
@@ -19,6 +19,7 @@ import { MacroItem } from '../../../../../engine/@types/config';
import { compressUuid } from '../../utils';
import project from '../../../../../project';
import { runStaticCompileCheck } from './static-compile-check';
+import { BuildExitCode } from '../../../../@types/protected';
type PlatformType = StatsQuery.ConstantManager.PlatformType;
interface IScriptProjectOption extends SharedSettings {
@@ -134,9 +135,13 @@ export class ScriptBuilder {
// 执行静态编译检查
// 注意:如果在 BuildCommand 中已经执行过,这里会重复执行。
// 但为了确保脚本编译的安全性,这里强制检查。
- const checkPassed = await runStaticCompileCheck(project.path, true);
- if (!checkPassed) {
- console.warn('⚠ Warning: Found assets-related TypeScript errors. Build will continue...');
+ const checkResult = await runStaticCompileCheck(project.path, true);
+ if (!checkResult.passed) {
+ // 构建失败,抛出错误,错误码为 500
+ const errorMessage = checkResult.errorMessage || 'Found assets-related TypeScript errors';
+ const error = new Error(errorMessage);
+ (error as any).code = BuildExitCode.STATIC_COMPILE_ERROR;
+ throw error;
}
const cceModuleMap = script.queryCCEModuleMap();
diff --git a/src/core/builder/worker/builder/asset-handler/script/static-compile-check.ts b/src/core/builder/worker/builder/asset-handler/script/static-compile-check.ts
index 52292454..97407828 100644
--- a/src/core/builder/worker/builder/asset-handler/script/static-compile-check.ts
+++ b/src/core/builder/worker/builder/asset-handler/script/static-compile-check.ts
@@ -82,9 +82,9 @@ function filterAssetsErrors(output: string): string {
* 执行静态编译检查
* @param projectPath 项目路径
* @param showOutput 是否显示输出信息(默认 true)
- * @returns 返回 true 表示检查通过(没有 assets 相关错误),false 表示有错误
+ * @returns 返回对象,包含检查结果和错误信息。passed 为 true 表示检查通过(没有 assets 相关错误),false 表示有错误
*/
-export async function runStaticCompileCheck(projectPath: string, showOutput: boolean = true): Promise {
+export async function runStaticCompileCheck(projectPath: string, showOutput: boolean = true): Promise<{ passed: boolean; errorMessage?: string }> {
if (showOutput) {
console.log(chalk.blue('Running TypeScript static compile check...'));
console.log(chalk.gray(`Project: ${projectPath}`));
@@ -119,7 +119,7 @@ export async function runStaticCompileCheck(projectPath: string, showOutput: boo
if (showOutput) {
console.log(chalk.green('✓ No assets-related TypeScript errors found!'));
}
- return true;
+ return { passed: true };
}
// 过滤出包含 "assets" 的错误
@@ -130,13 +130,13 @@ export async function runStaticCompileCheck(projectPath: string, showOutput: boo
if (showOutput) {
console.log(filteredOutput);
}
- return false;
+ return { passed: false, errorMessage: filteredOutput };
} else {
// 没有 assets 相关的错误
if (showOutput) {
console.log(chalk.green('✓ No assets-related TypeScript errors found!'));
}
- return true;
+ return { passed: true };
}
} catch (error: any) {
// execAsync 在命令返回非零退出码时会抛出错误
@@ -152,7 +152,7 @@ export async function runStaticCompileCheck(projectPath: string, showOutput: boo
if (showOutput) {
console.log(chalk.green('✓ No assets-related TypeScript errors found!'));
}
- return true;
+ return { passed: true };
}
// 过滤出包含 "assets" 的错误
@@ -163,13 +163,13 @@ export async function runStaticCompileCheck(projectPath: string, showOutput: boo
if (showOutput) {
console.log(filteredOutput);
}
- return false;
+ return { passed: false, errorMessage: filteredOutput };
} else {
// 没有 assets 相关的错误
if (showOutput) {
console.log(chalk.green('✓ No assets-related TypeScript errors found!'));
}
- return true;
+ return { passed: true };
}
}
}