/** * @description 通用 Vite 开发启动脚本,先构建 Monaco DTS,再按指定 mode 启动 Vite。 */ import { spawn } from 'node:child_process'; import { basename, dirname, resolve } from 'node:path'; import process from 'node:process'; import { fileURLToPath } from 'node:url'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const pkgRoot = resolve(__dirname, '..'); const cliArgs = process.argv.slice(2); const modeFlagIndex = cliArgs.findIndex(arg => arg === '--mode'); const modeArg = modeFlagIndex >= 0 ? String(cliArgs[modeFlagIndex + 1] || '').trim() : ''; const mode = modeArg || String(process.env.BUSINESS_RULES_MODE || 'dev').trim() || 'dev'; /** * @description 以继承输出的方式执行命令,并等待结束。 * @param {string} command 命令。 * @param {string[]} args 参数。 * @param {NodeJS.ProcessEnv} env 环境变量。 * @returns {Promise} */ function runCommand(command, args, env) { return new Promise((resolvePromise, rejectPromise) => { const child = spawn(command, args, { cwd: pkgRoot, env, stdio: 'inherit', }); child.on('error', rejectPromise); child.on('exit', (code, signal) => { if (signal) { rejectPromise(new Error(`${command} exited with signal ${signal}`)); return; } if (code !== 0) { rejectPromise(new Error(`${command} ${args.join(' ')} exited with code ${code}`)); return; } resolvePromise(); }); }); } /** * @description 解析当前 pnpm runner。Windows 下裸 spawn('pnpm') 不会稳定命中 pnpm.cmd, * 优先复用 pnpm 注入的 npm_execpath,保证 Windows/macOS 都走同一个包管理器入口。 * @param {NodeJS.ProcessEnv} env 环境变量。 * @returns {{ command: string, args: string[] }} 可执行命令与预置参数。 */ function resolvePnpmRunner(env) { const npmExecPath = String(env.npm_execpath || '').trim(); const npmExecName = basename(npmExecPath).toLowerCase(); if (npmExecPath && npmExecName.includes('pnpm')) { return { command: process.execPath, args: [npmExecPath], }; } return { command: process.platform === 'win32' ? 'pnpm.cmd' : 'pnpm', args: [], }; } async function runPnpm(args, env) { const runner = resolvePnpmRunner(env); await runCommand(runner.command, [...runner.args, ...args], env); } await runCommand(process.execPath, ['./scripts/BuildMonacoDts.mjs'], process.env); await runPnpm(['vite', '--mode', mode, '--force'], process.env);