From 4cb32d372be8d4f7ff28ec0b5627125f01e6f263 Mon Sep 17 00:00:00 2001 From: Himmelschmidt <46351743+Himmelschmidt@users.noreply.github.com> Date: Fri, 18 Jul 2025 14:09:08 -0400 Subject: [PATCH] Fix Tailwind race condition in fullstack serve mode (#4433) Skip Tailwind watcher in fullstack mode to prevent race conditions between the watcher and prebuild() both trying to install/run Tailwind simultaneously. In fullstack mode, the client build's prebuild() properly handles Tailwind generation, making the watcher redundant and problematic. Fixes "Text file busy" error when running: dx serve --fullstack true --platform web Fixes #4431 --- packages/cli/src/serve/runner.rs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/cli/src/serve/runner.rs b/packages/cli/src/serve/runner.rs index 04f237d8f..696c40a3c 100644 --- a/packages/cli/src/serve/runner.rs +++ b/packages/cli/src/serve/runner.rs @@ -166,11 +166,18 @@ impl AppServer { let client = AppBuilder::new(&client)?; let server = server.map(|server| AppBuilder::new(&server)).transpose()?; - let tw_watcher = TailwindCli::serve( - client.build.package_manifest_dir(), - client.build.config.application.tailwind_input.clone(), - client.build.config.application.tailwind_output.clone(), - ); + // Only start Tailwind watcher for client builds that serve assets (not server builds or fullstack mode) + // In fullstack mode, the client build's prebuild() handles Tailwind generation to avoid race conditions + let tw_watcher = if client.build.platform != Platform::Server && !fullstack { + TailwindCli::serve( + client.build.package_manifest_dir(), + client.build.config.application.tailwind_input.clone(), + client.build.config.application.tailwind_output.clone(), + ) + } else { + // Return a dummy task that immediately completes for server builds or fullstack mode + tokio::spawn(async { Ok(()) }) + }; _ = client.build.start_simulators().await;