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.
chajia/lib/infra/ensure-native-infra.ts

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 },
);
}