feat: enhance desktop build process with artifact upload and download, and update server working directory resolution

This commit is contained in:
cita
2026-03-06 20:25:48 +08:00
parent 6c51801e50
commit 02bf0393e6
6 changed files with 54 additions and 5 deletions
+6 -1
View File
@@ -18,6 +18,7 @@ import {
createDesktopHealthUrl,
createDesktopServerUrl,
isFatalServerExit,
resolveDesktopServerWorkingDir,
waitForServerReady,
} from './runtime.js';
@@ -195,7 +196,11 @@ async function startManagedBackend() {
});
const child = spawn(process.execPath, [serverEntryPath], {
cwd: app.getAppPath(),
cwd: resolveDesktopServerWorkingDir({
appPath: app.getAppPath(),
resourcesPath: process.resourcesPath,
isPackaged: app.isPackaged,
}),
env: {
...env,
ELECTRON_RUN_AS_NODE: '1',
+15
View File
@@ -3,6 +3,7 @@ import {
buildDesktopServerEnv,
createDesktopServerUrl,
isFatalServerExit,
resolveDesktopServerWorkingDir,
waitForServerReady,
} from './runtime.js';
@@ -30,6 +31,20 @@ describe('desktop runtime helpers', () => {
expect(createDesktopServerUrl(4312)).toBe('http://127.0.0.1:4312');
});
it('uses resources path as backend cwd for packaged desktop builds', () => {
expect(resolveDesktopServerWorkingDir({
appPath: 'C:/Users/test/AppData/Local/Programs/Metapi/resources/app.asar',
resourcesPath: 'C:/Users/test/AppData/Local/Programs/Metapi/resources',
isPackaged: true,
})).toBe('C:/Users/test/AppData/Local/Programs/Metapi/resources');
expect(resolveDesktopServerWorkingDir({
appPath: '/workspace/metapi',
resourcesPath: '/tmp/electron/resources',
isPackaged: false,
})).toBe('/workspace/metapi');
});
it('waits until the health probe returns ok', async () => {
const fetcher = vi.fn()
.mockRejectedValueOnce(new Error('offline'))
+10
View File
@@ -17,6 +17,12 @@ type ServerExitState = {
signal: NodeJS.Signals | null;
};
type DesktopServerWorkingDirInput = {
appPath: string;
resourcesPath: string;
isPackaged: boolean;
};
const DEFAULT_READY_TIMEOUT_MS = 30_000;
const DEFAULT_READY_INTERVAL_MS = 250;
@@ -43,6 +49,10 @@ export function createDesktopHealthUrl(port: number): string {
return `${createDesktopServerUrl(port)}/api/desktop/health`;
}
export function resolveDesktopServerWorkingDir(input: DesktopServerWorkingDirInput): string {
return input.isPackaged ? input.resourcesPath : input.appPath;
}
export async function waitForServerReady(input: WaitForServerReadyInput): Promise<void> {
const fetcher = input.fetcher || ((url: string, init?: RequestInit) => fetch(url, init));
const timeoutMs = input.timeoutMs ?? DEFAULT_READY_TIMEOUT_MS;