From f6b67f3393d2aac4f91867bb35399f9ded4336e7 Mon Sep 17 00:00:00 2001 From: Zan Pan Date: Thu, 11 Jun 2026 08:31:45 +0800 Subject: [PATCH 1/3] Support copying resource dirs for the bundler Recursively copies files and directories using a custom method `copy_entries`. Fix #5504 --- packages/cli/src/bundler/mod.rs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/bundler/mod.rs b/packages/cli/src/bundler/mod.rs index 41f5366ce2..0fb0f9f982 100644 --- a/packages/cli/src/bundler/mod.rs +++ b/packages/cli/src/bundler/mod.rs @@ -362,6 +362,19 @@ impl<'a> BundleContext<'a> { /// Copy resources to the given path. pub(crate) fn copy_resources(&self, dest: &Path) -> Result<()> { + fn copy_entries(src: &Path, dst: &Path) -> Result<(), std::io::Error> { + if src.is_dir() { + for entry in src.read_dir()? { + let entry = entry?; + let dst = dst.join(entry.file_name()); + copy_entries(&entry.path(), &dst)?; + } + } else { + std::fs::copy(src, dst)?; + } + Ok(()) + } + for (src, target) in &self.resources_map { let src_path = PathBuf::from(src); if !src_path.exists() { @@ -376,7 +389,7 @@ impl<'a> BundleContext<'a> { if let Some(parent) = dest_path.parent() { std::fs::create_dir_all(parent)?; } - std::fs::copy(&src_path, &dest_path).with_context(|| { + copy_entries(&src_path, &dest_path).with_context(|| { format!("Failed to copy resource {src} -> {}", dest_path.display()) })?; } From 76307c97599eb65444c6bc7f7a07219fda7a27f5 Mon Sep 17 00:00:00 2001 From: Zan Pan Date: Thu, 11 Jun 2026 10:26:02 +0800 Subject: [PATCH 2/3] Ensure destination directory is created in copy_resources This is necessary to avoid the `NotFound` error. --- packages/cli/src/bundler/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/cli/src/bundler/mod.rs b/packages/cli/src/bundler/mod.rs index 0fb0f9f982..e38ecae827 100644 --- a/packages/cli/src/bundler/mod.rs +++ b/packages/cli/src/bundler/mod.rs @@ -364,6 +364,7 @@ impl<'a> BundleContext<'a> { pub(crate) fn copy_resources(&self, dest: &Path) -> Result<()> { fn copy_entries(src: &Path, dst: &Path) -> Result<(), std::io::Error> { if src.is_dir() { + std::fs::create_dir_all(dst)?; for entry in src.read_dir()? { let entry = entry?; let dst = dst.join(entry.file_name()); From 8eb0cf857d826a008ab6a02f834d7fcd10bf8f8b Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Mon, 15 Jun 2026 10:39:05 -0500 Subject: [PATCH 3/3] use the existing copy_dir_recursive --- packages/cli/src/bundler/mod.rs | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/packages/cli/src/bundler/mod.rs b/packages/cli/src/bundler/mod.rs index e38ecae827..477d4df9dd 100644 --- a/packages/cli/src/bundler/mod.rs +++ b/packages/cli/src/bundler/mod.rs @@ -362,20 +362,6 @@ impl<'a> BundleContext<'a> { /// Copy resources to the given path. pub(crate) fn copy_resources(&self, dest: &Path) -> Result<()> { - fn copy_entries(src: &Path, dst: &Path) -> Result<(), std::io::Error> { - if src.is_dir() { - std::fs::create_dir_all(dst)?; - for entry in src.read_dir()? { - let entry = entry?; - let dst = dst.join(entry.file_name()); - copy_entries(&entry.path(), &dst)?; - } - } else { - std::fs::copy(src, dst)?; - } - Ok(()) - } - for (src, target) in &self.resources_map { let src_path = PathBuf::from(src); if !src_path.exists() { @@ -390,9 +376,14 @@ impl<'a> BundleContext<'a> { if let Some(parent) = dest_path.parent() { std::fs::create_dir_all(parent)?; } - copy_entries(&src_path, &dest_path).with_context(|| { - format!("Failed to copy resource {src} -> {}", dest_path.display()) - })?; + if src_path.is_dir() { + copy_dir_recursive(&src_path, &dest_path) + } else { + std::fs::copy(&src_path, &dest_path) + .map(|_| ()) + .map_err(Into::into) + } + .with_context(|| format!("Failed to copy resource {src} -> {}", dest_path.display()))?; } Ok(()) }