Files

75 lines
2.5 KiB
JavaScript
Raw Permalink Normal View History

2026-05-23 14:05:22 +08:00
/**
* @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<void>}
*/
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);