完成
This commit is contained in:
99
scripts/dev-all.mjs
Normal file
99
scripts/dev-all.mjs
Normal file
@@ -0,0 +1,99 @@
|
||||
import { execFileSync, spawn } from "node:child_process";
|
||||
import { existsSync } from "node:fs";
|
||||
|
||||
const isWindows = process.platform === "win32";
|
||||
|
||||
function detectPackageManager() {
|
||||
const userAgent = process.env.npm_config_user_agent ?? "";
|
||||
|
||||
if (userAgent.startsWith("pnpm/")) {
|
||||
return "pnpm";
|
||||
}
|
||||
|
||||
if (userAgent.startsWith("yarn/")) {
|
||||
return "yarn";
|
||||
}
|
||||
|
||||
if (userAgent.startsWith("npm/")) {
|
||||
return "npm";
|
||||
}
|
||||
|
||||
if (existsSync("pnpm-lock.yaml")) {
|
||||
return "pnpm";
|
||||
}
|
||||
|
||||
if (existsSync("yarn.lock")) {
|
||||
return "yarn";
|
||||
}
|
||||
|
||||
return "npm";
|
||||
}
|
||||
|
||||
const packageManager = detectPackageManager();
|
||||
const commands = [
|
||||
`${packageManager} run dev:server`,
|
||||
`${packageManager} run dev`,
|
||||
];
|
||||
|
||||
function startCommand(command) {
|
||||
if (isWindows) {
|
||||
return spawn("cmd.exe", ["/d", "/s", "/c", command], {
|
||||
cwd: process.cwd(),
|
||||
stdio: "inherit",
|
||||
});
|
||||
}
|
||||
|
||||
return spawn(command, {
|
||||
cwd: process.cwd(),
|
||||
stdio: "inherit",
|
||||
shell: true,
|
||||
});
|
||||
}
|
||||
|
||||
const children = commands.map(startCommand);
|
||||
let shuttingDown = false;
|
||||
|
||||
function stopChild(child) {
|
||||
if (child.exitCode !== null || child.killed) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (isWindows) {
|
||||
try {
|
||||
execFileSync("taskkill", ["/pid", String(child.pid), "/t", "/f"], {
|
||||
stdio: "ignore",
|
||||
});
|
||||
} catch {
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
child.kill("SIGTERM");
|
||||
} catch {
|
||||
}
|
||||
}
|
||||
|
||||
function shutdown(code = 0) {
|
||||
if (shuttingDown) {
|
||||
return;
|
||||
}
|
||||
|
||||
shuttingDown = true;
|
||||
children.forEach(stopChild);
|
||||
process.exit(code);
|
||||
}
|
||||
|
||||
process.on("SIGINT", () => shutdown(0));
|
||||
process.on("SIGTERM", () => shutdown(0));
|
||||
|
||||
children.forEach((child) => {
|
||||
child.on("error", () => shutdown(1));
|
||||
child.on("exit", (code) => {
|
||||
if (shuttingDown) {
|
||||
return;
|
||||
}
|
||||
|
||||
shutdown(code ?? 0);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user