From b60d86116a960f82967d76535536467ee206e668 Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Mon, 20 Apr 2026 22:54:21 +0100 Subject: [PATCH] fix(tauri): fall back to Node server on Linux --- packages/tauri-app/scripts/prebuild.js | 10 ++- .../tauri-app/src-tauri/src/cli_manager.rs | 76 +++++++++++++++++-- 2 files changed, 80 insertions(+), 6 deletions(-) diff --git a/packages/tauri-app/scripts/prebuild.js b/packages/tauri-app/scripts/prebuild.js index d348179a..72159e73 100644 --- a/packages/tauri-app/scripts/prebuild.js +++ b/packages/tauri-app/scripts/prebuild.js @@ -87,6 +87,10 @@ function ensureStandaloneServerBuild() { }) } +function shouldBuildStandaloneServer() { + return process.platform !== "linux" +} + function ensureUiBuild() { const loadingHtml = path.join(uiDist, "loading.html") if (fs.existsSync(loadingHtml)) { @@ -347,7 +351,11 @@ function copyUiLoadingAssets() { ensureEsbuildPlatformBinary() ensureServerDependencies() ensureServerBuild() - ensureStandaloneServerBuild() + if (shouldBuildStandaloneServer()) { + ensureStandaloneServerBuild() + } else { + console.log("[prebuild] skipping standalone server executable for Linux packaging; linuxdeploy fails on the bundled ELF") + } ensureUiBuild() syncServerUiBundle() copyServerArtifacts() diff --git a/packages/tauri-app/src-tauri/src/cli_manager.rs b/packages/tauri-app/src-tauri/src/cli_manager.rs index ea2e3360..780e6bac 100644 --- a/packages/tauri-app/src-tauri/src/cli_manager.rs +++ b/packages/tauri-app/src-tauri/src/cli_manager.rs @@ -687,7 +687,9 @@ impl CliProcessManager { ShellCommandType::Direct(cmd) => { log_line(&format!("spawn command: {} {:?}", cmd.program, cmd.args)); let mut c = Command::new(&cmd.program); - c.args(&cmd.args).stdout(Stdio::piped()).stderr(Stdio::piped()); + c.args(&cmd.args) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()); if resolution.runner != Runner::Standalone { c.env("ELECTRON_RUN_AS_NODE", "1"); } @@ -1064,6 +1066,7 @@ struct CliEntry { #[derive(Debug, Clone, Copy, PartialEq, Eq)] enum Runner { + Node, Standalone, Tsx, } @@ -1094,8 +1097,17 @@ impl CliEntry { }); } + if let Some(entry) = resolve_dist_entry(app) { + return Ok(Self { + entry, + runner: Runner::Node, + runner_path: None, + node_binary, + }); + } + Err(anyhow::anyhow!( - "Unable to locate standalone CodeNomad server executable. Please run `npm run build:standalone --workspace @neuralnomads/codenomad`." + "Unable to locate CodeNomad CLI build. Please run `npm run build --workspace @neuralnomads/codenomad`." )) } @@ -1238,16 +1250,70 @@ fn resolve_standalone_entry(_app: &AppHandle) -> Option { if let Ok(exe) = std::env::current_exe() { if let Some(dir) = exe.parent() { - candidates.push(Some(dir.join("resources/server/dist").join(executable_name))); + candidates.push(Some( + dir.join("resources/server/dist").join(executable_name), + )); let resources = dir.join("../Resources"); candidates.push(Some(resources.join("server/dist").join(executable_name))); - candidates.push(Some(resources.join("resources/server/dist").join(executable_name))); + candidates.push(Some( + resources + .join("resources/server/dist") + .join(executable_name), + )); let linux_resource_roots = [dir.join("../lib/CodeNomad"), dir.join("../lib/codenomad")]; for root in linux_resource_roots { candidates.push(Some(root.join("server/dist").join(executable_name))); - candidates.push(Some(root.join("resources/server/dist").join(executable_name))); + candidates.push(Some( + root.join("resources/server/dist").join(executable_name), + )); + } + } + } + + first_existing(candidates) +} + +fn resolve_dist_entry(_app: &AppHandle) -> Option { + let base = workspace_root(); + let mut candidates: Vec> = vec![ + base.as_ref().map(|p| p.join("packages/server/dist/bin.js")), + base.as_ref() + .map(|p| p.join("packages/server/dist/index.js")), + base.as_ref().map(|p| p.join("server/dist/bin.js")), + base.as_ref().map(|p| p.join("server/dist/index.js")), + ]; + + if let Ok(exe) = std::env::current_exe() { + if let Some(dir) = exe.parent() { + candidates.push(Some(dir.join("resources/server/dist/bin.js"))); + candidates.push(Some(dir.join("resources/server/dist/index.js"))); + candidates.push(Some(dir.join("resources/server/dist/server/bin.js"))); + candidates.push(Some(dir.join("resources/server/dist/server/index.js"))); + + let resources = dir.join("../Resources"); + candidates.push(Some(resources.join("server/dist/bin.js"))); + candidates.push(Some(resources.join("server/dist/index.js"))); + candidates.push(Some(resources.join("server/dist/server/bin.js"))); + candidates.push(Some(resources.join("server/dist/server/index.js"))); + candidates.push(Some(resources.join("resources/server/dist/bin.js"))); + candidates.push(Some(resources.join("resources/server/dist/index.js"))); + candidates.push(Some(resources.join("resources/server/dist/server/bin.js"))); + candidates.push(Some( + resources.join("resources/server/dist/server/index.js"), + )); + + let linux_resource_roots = [dir.join("../lib/CodeNomad"), dir.join("../lib/codenomad")]; + for root in linux_resource_roots { + candidates.push(Some(root.join("server/dist/bin.js"))); + candidates.push(Some(root.join("server/dist/index.js"))); + candidates.push(Some(root.join("server/dist/server/bin.js"))); + candidates.push(Some(root.join("server/dist/server/index.js"))); + candidates.push(Some(root.join("resources/server/dist/bin.js"))); + candidates.push(Some(root.join("resources/server/dist/index.js"))); + candidates.push(Some(root.join("resources/server/dist/server/bin.js"))); + candidates.push(Some(root.join("resources/server/dist/server/index.js"))); } } }