You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.4 KiB
46 lines
1.4 KiB
import { execSync } from "node:child_process";
|
|
import path from "node:path";
|
|
|
|
const DEFAULT_WSL_DISTRO = "Ubuntu-22.04";
|
|
|
|
function toWslPath(winPath: string): string {
|
|
const normalized = path.resolve(winPath);
|
|
const match = normalized.match(/^([a-zA-Z]):[\\/]+(.*)/);
|
|
if (!match) {
|
|
return normalized.replace(/\\/g, "/");
|
|
}
|
|
return `/mnt/${match[1].toLowerCase()}/${match[2].replace(/\\/g, "/")}`;
|
|
}
|
|
|
|
/** Windows + DEV_INFRA_MODE=native 时自动拉起 WSL mysql/redis */
|
|
export function ensureNativeInfraIfNeeded(): void {
|
|
if (process.env.SKIP_NATIVE_INFRA_BOOTSTRAP === "true") {
|
|
return;
|
|
}
|
|
if (process.platform !== "win32") {
|
|
return;
|
|
}
|
|
const mode = process.env.DEV_INFRA_MODE?.trim().toLowerCase();
|
|
if (mode !== "native") {
|
|
return;
|
|
}
|
|
|
|
const scriptPath = path.join(
|
|
process.cwd(),
|
|
"scripts",
|
|
"dev",
|
|
"wsl-infra.sh",
|
|
);
|
|
const wslScript = toWslPath(scriptPath);
|
|
const distro = process.env.WSL_DISTRO?.trim() || DEFAULT_WSL_DISTRO;
|
|
const mysqlPort = process.env.MYSQL_HOST_PORT?.trim() || "3307";
|
|
const mysqlPassword =
|
|
process.env.MYSQL_ROOT_PASSWORD?.trim() || "changeme";
|
|
|
|
console.log(`[infra] 确保 WSL 基础设施就绪 (distro=${distro})…`);
|
|
execSync(
|
|
`wsl -d ${distro} bash -c "export MYSQL_HOST_PORT=${mysqlPort} MYSQL_ROOT_PASSWORD=${mysqlPassword}; bash '${wslScript}' start"`,
|
|
{ stdio: "pipe", timeout: 90_000, windowsHide: true },
|
|
);
|
|
}
|