From 4502d66fd3c98bef1509cba8e6afaf04cc91c39d Mon Sep 17 00:00:00 2001 From: Alexander Petric Date: Fri, 11 Jul 2025 16:51:48 -0400 Subject: [PATCH] fix: worker symlink dir + path fixes + npm postinstall on windows (#6167) --- backend/windmill-worker/src/worker.rs | 29 +++++++++++++++++++++++---- frontend/package.json | 2 +- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/backend/windmill-worker/src/worker.rs b/backend/windmill-worker/src/worker.rs index 7f0c535f40..8f50053b60 100644 --- a/backend/windmill-worker/src/worker.rs +++ b/backend/windmill-worker/src/worker.rs @@ -82,7 +82,7 @@ use serde_json::value::RawValue; use tokio::fs::symlink; #[cfg(target_os = "windows")] -use tokio::fs::symlink_file as symlink; +use tokio::fs::symlink_dir; use tokio::{ sync::{ @@ -1714,9 +1714,30 @@ pub async fn run_worker( let parent_flow = job.parent_job.unwrap(); let parent_shared_dir = format!("{worker_dir}/{parent_flow}/shared"); create_directory_async(&parent_shared_dir).await; - symlink(&parent_shared_dir, target) - .await - .expect("could not symlink target"); + + #[cfg(windows)] + { + // On Windows, try symlink_dir + let windows_target = target.replace("/", "\\"); + let windows_parent = parent_shared_dir.replace("/", "\\"); + + match symlink_dir(&windows_parent, &windows_target).await { + Ok(_) => { + tracing::info!("Successfully created directory symlink on Windows"); + } + Err(e) => { + tracing::warn!("Failed to create symlink_dir on Windows (likely needs admin privileges or Developer Mode): {}", e); + create_directory_async(&target).await; + } + } + } + + #[cfg(not(windows))] + { + symlink(&parent_shared_dir, &target) + .await + .expect("could not symlink target"); + } } } else { create_directory_async(target).await; diff --git a/frontend/package.json b/frontend/package.json index e78b3ff653..642a46a19b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -5,7 +5,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", - "postinstall": "if [ -f ./scripts/untar_ui_builder.js ]; then node ./scripts/untar_ui_builder.js && node ./scripts/patch_files.js; fi", + "postinstall": "node -e \"if (require('fs').existsSync('./scripts/untar_ui_builder.js')) { require('child_process').execSync('node ./scripts/untar_ui_builder.js && node ./scripts/patch_files.js', {stdio: 'inherit'}) }\"", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --threshold warning", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", "lint": "prettier --ignore-path .gitignore --check --plugin-search-dir=. . && eslint --ignore-path .gitignore .",