接入本地认证启动配置
This commit is contained in:
+4
-2
@@ -14,7 +14,9 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"start:local": "node scripts/start-local.cjs",
|
"start:local": "node scripts/start-local.cjs",
|
||||||
"start:check": "node scripts/start-local.cjs --check",
|
"start:check": "node scripts/start-local.cjs --check",
|
||||||
"dev": "set VITE_DEV_SERVER_URL=http://127.0.0.1:3354&& vite --host 127.0.0.1 --port 3354 --strictPort",
|
"auth:local": "node scripts/local-auth-server.cjs",
|
||||||
|
"admin:local": "node server/local-auth/index.cjs",
|
||||||
|
"dev": "set AUTH_SERVER_URL=http://127.0.0.1:3302&& set VITE_DEV_SERVER_URL=http://127.0.0.1:3354&& vite --host 127.0.0.1 --port 3354 --strictPort",
|
||||||
"typecheck": "vue-tsc --noEmit",
|
"typecheck": "vue-tsc --noEmit",
|
||||||
"build": "node scripts/clean-build-artifacts.cjs && vite build",
|
"build": "node scripts/clean-build-artifacts.cjs && vite build",
|
||||||
"build:dev": "node scripts/clean-build-artifacts.cjs && vite build --mode development",
|
"build:dev": "node scripts/clean-build-artifacts.cjs && vite build --mode development",
|
||||||
@@ -22,7 +24,7 @@
|
|||||||
"version:sync": "node scripts/sync-version.cjs",
|
"version:sync": "node scripts/sync-version.cjs",
|
||||||
"dev:all": "npm run dev:electron",
|
"dev:all": "npm run dev:electron",
|
||||||
"dev:win": "npm run dev:electron",
|
"dev:win": "npm run dev:electron",
|
||||||
"dev:electron": "concurrently \"set VITE_DEV_SERVER_URL=http://127.0.0.1:3354&& set EXTERNAL_ELECTRON_DEV=1&& vite --host 127.0.0.1 --port 3354 --strictPort\" \"set VITE_DEV_SERVER_URL=http://127.0.0.1:3354&& node scripts/dev-electron.cjs\"",
|
"dev:electron": "concurrently \"set AUTH_SERVER_URL=http://127.0.0.1:3302&& set VITE_DEV_SERVER_URL=http://127.0.0.1:3354&& set EXTERNAL_ELECTRON_DEV=1&& vite --host 127.0.0.1 --port 3354 --strictPort\" \"set AUTH_SERVER_URL=http://127.0.0.1:3302&& set VITE_DEV_SERVER_URL=http://127.0.0.1:3354&& node scripts/dev-electron.cjs\"",
|
||||||
"prepare-package": "node apply-oem.cjs && py -3 scripts/export-runtime-system-templates.py && node scripts/prepare-package.cjs",
|
"prepare-package": "node apply-oem.cjs && py -3 scripts/export-runtime-system-templates.py && node scripts/prepare-package.cjs",
|
||||||
"build:win": "npm run prepare-package && npm run build && node scripts/build-resource-artifacts.cjs && electron-builder --win --x64 && node scripts/fix-latest-yml.cjs && node scripts/assemble-release-artifacts.cjs",
|
"build:win": "npm run prepare-package && npm run build && node scripts/build-resource-artifacts.cjs && electron-builder --win --x64 && node scripts/fix-latest-yml.cjs && node scripts/assemble-release-artifacts.cjs",
|
||||||
"build:win:only": "electron-builder --win --x64",
|
"build:win:only": "electron-builder --win --x64",
|
||||||
|
|||||||
+77
-13
@@ -5,6 +5,7 @@ const { spawn, spawnSync } = require("node:child_process");
|
|||||||
|
|
||||||
const projectRoot = path.resolve(__dirname, "..");
|
const projectRoot = path.resolve(__dirname, "..");
|
||||||
const serverUrl = process.env.VITE_DEV_SERVER_URL || "http://127.0.0.1:3354";
|
const serverUrl = process.env.VITE_DEV_SERVER_URL || "http://127.0.0.1:3354";
|
||||||
|
const authServerUrl = process.env.AUTH_SERVER_URL || "http://127.0.0.1:3302";
|
||||||
const npmCommand = process.platform === "win32" ? "npm.cmd" : "npm";
|
const npmCommand = process.platform === "win32" ? "npm.cmd" : "npm";
|
||||||
const requiredNodeMajor = 20;
|
const requiredNodeMajor = 20;
|
||||||
const checkOnly = process.argv.includes("--check");
|
const checkOnly = process.argv.includes("--check");
|
||||||
@@ -18,11 +19,11 @@ function fail(message) {
|
|||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseServerUrl(url) {
|
function parseUrl(url, name) {
|
||||||
try {
|
try {
|
||||||
return new URL(url);
|
return new URL(url);
|
||||||
} catch {
|
} catch {
|
||||||
fail(`VITE_DEV_SERVER_URL 无效:${url}`);
|
fail(`${name} 无效:${url}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,13 +58,13 @@ function checkDependencies() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function assertPortAvailable(host, port) {
|
function assertPortAvailable(host, port, label) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const server = net.createServer();
|
const server = net.createServer();
|
||||||
|
|
||||||
server.once("error", error => {
|
server.once("error", error => {
|
||||||
if (error.code === "EADDRINUSE") {
|
if (error.code === "EADDRINUSE") {
|
||||||
reject(new Error(`端口 ${port} 已被占用,请先关闭已有 Vite/Electron 开发进程。`));
|
reject(new Error(`${label} 端口 ${port} 已被占用,请先关闭已有进程。`));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
reject(error);
|
reject(error);
|
||||||
@@ -77,24 +78,75 @@ function assertPortAvailable(host, port) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function canConnect(host, port) {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
const socket = net.createConnection({ host, port });
|
||||||
|
const finish = ok => {
|
||||||
|
socket.destroy();
|
||||||
|
resolve(ok);
|
||||||
|
};
|
||||||
|
socket.setTimeout(500);
|
||||||
|
socket.once("connect", () => finish(true));
|
||||||
|
socket.once("timeout", () => finish(false));
|
||||||
|
socket.once("error", () => finish(false));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function startLocalAuth(authUrl) {
|
||||||
|
const authHost = authUrl.hostname || "127.0.0.1";
|
||||||
|
const authPort = Number(authUrl.port || 3302);
|
||||||
|
|
||||||
|
if (await canConnect(authHost, authPort)) {
|
||||||
|
log(`本地认证服务已在运行:${authServerUrl}`);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const child = spawn(process.execPath, ["scripts/local-auth-server.cjs"], {
|
||||||
|
cwd: projectRoot,
|
||||||
|
stdio: "inherit",
|
||||||
|
env: {
|
||||||
|
...process.env,
|
||||||
|
LOCAL_AUTH_HOST: authHost,
|
||||||
|
LOCAL_AUTH_PORT: String(authPort),
|
||||||
|
},
|
||||||
|
shell: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
child.on("error", error => {
|
||||||
|
fail(`本地认证服务启动失败:${error.message}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
for (let attempt = 0; attempt < 40; attempt++) {
|
||||||
|
if (await canConnect(authHost, authPort)) {
|
||||||
|
return child;
|
||||||
|
}
|
||||||
|
await new Promise(resolve => setTimeout(resolve, 250));
|
||||||
|
}
|
||||||
|
|
||||||
|
child.kill();
|
||||||
|
fail(`本地认证服务未能在 ${authServerUrl} 启动。`);
|
||||||
|
}
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
process.chdir(projectRoot);
|
process.chdir(projectRoot);
|
||||||
|
|
||||||
const parsedUrl = parseServerUrl(serverUrl);
|
const parsedServerUrl = parseUrl(serverUrl, "VITE_DEV_SERVER_URL");
|
||||||
const host = parsedUrl.hostname || "127.0.0.1";
|
const parsedAuthUrl = parseUrl(authServerUrl, "AUTH_SERVER_URL");
|
||||||
const port = Number(parsedUrl.port || 3344);
|
const viteHost = parsedServerUrl.hostname || "127.0.0.1";
|
||||||
|
const vitePort = Number(parsedServerUrl.port || 3354);
|
||||||
|
|
||||||
log("========================================");
|
log("========================================");
|
||||||
log(" 本地快速启动:Vite + Electron");
|
log(" 本地快速启动:Local Auth + Vite + Electron");
|
||||||
log("========================================");
|
log("========================================");
|
||||||
log(`项目目录:${projectRoot}`);
|
log(`项目目录:${projectRoot}`);
|
||||||
|
log(`认证服务:${authServerUrl}`);
|
||||||
log(`开发地址:${serverUrl}`);
|
log(`开发地址:${serverUrl}`);
|
||||||
log("");
|
log("");
|
||||||
|
|
||||||
checkNodeVersion();
|
checkNodeVersion();
|
||||||
const npmVersion = checkCommand(npmCommand, ["--version"], "npm");
|
const npmVersion = checkCommand(npmCommand, ["--version"], "npm");
|
||||||
checkDependencies();
|
checkDependencies();
|
||||||
await assertPortAvailable(host, port);
|
await assertPortAvailable(viteHost, vitePort, "Vite");
|
||||||
|
|
||||||
log(`Node.js:${process.version}`);
|
log(`Node.js:${process.version}`);
|
||||||
log(`npm:${npmVersion}`);
|
log(`npm:${npmVersion}`);
|
||||||
@@ -105,24 +157,36 @@ async function main() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const authChild = await startLocalAuth(parsedAuthUrl);
|
||||||
|
|
||||||
|
log("");
|
||||||
log("正在启动应用,关闭此窗口即可停止开发服务。");
|
log("正在启动应用,关闭此窗口即可停止开发服务。");
|
||||||
|
log("默认本地账号:13800138000 / 123456");
|
||||||
log("");
|
log("");
|
||||||
|
|
||||||
const child = spawn(npmCommand, ["run", "dev:electron"], {
|
const appChild = spawn(npmCommand, ["run", "dev:electron"], {
|
||||||
cwd: projectRoot,
|
cwd: projectRoot,
|
||||||
stdio: "inherit",
|
stdio: "inherit",
|
||||||
env: {
|
env: {
|
||||||
...process.env,
|
...process.env,
|
||||||
VITE_DEV_SERVER_URL: serverUrl,
|
VITE_DEV_SERVER_URL: serverUrl,
|
||||||
|
AUTH_SERVER_URL: authServerUrl,
|
||||||
},
|
},
|
||||||
shell: process.platform === "win32",
|
shell: process.platform === "win32",
|
||||||
});
|
});
|
||||||
|
|
||||||
child.on("exit", code => {
|
const shutdown = code => {
|
||||||
|
if (authChild && !authChild.killed) {
|
||||||
|
authChild.kill();
|
||||||
|
}
|
||||||
process.exit(code ?? 0);
|
process.exit(code ?? 0);
|
||||||
});
|
};
|
||||||
|
|
||||||
child.on("error", error => {
|
process.on("SIGINT", () => shutdown(0));
|
||||||
|
process.on("SIGTERM", () => shutdown(0));
|
||||||
|
|
||||||
|
appChild.on("exit", shutdown);
|
||||||
|
appChild.on("error", error => {
|
||||||
fail(`启动失败:${error.message}`);
|
fail(`启动失败:${error.message}`);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -12,7 +12,7 @@ export const AppConfig = {
|
|||||||
website: ``,
|
website: ``,
|
||||||
websiteGithub: "",
|
websiteGithub: "",
|
||||||
websiteGitee: "",
|
websiteGitee: "",
|
||||||
apiBaseUrl: `http://49.233.157.120:3002/api`,
|
apiBaseUrl: `http://127.0.0.1:3302/api`,
|
||||||
updaterUrl: ``,
|
updaterUrl: ``,
|
||||||
downloadUrl: ``,
|
downloadUrl: ``,
|
||||||
feedbackUrl: ``,
|
feedbackUrl: ``,
|
||||||
|
|||||||
Reference in New Issue
Block a user