Просмотр исходного кода

fix(bundler): DLL resources, closes #3948 (#3949)

Lucas Fernandes Nogueira 3 лет назад
Родитель
Сommit
f66bc3c2b8
2 измененных файлов с 40 добавлено и 28 удалено
  1. 5 0
      .changes/fix-dll-resource.md
  2. 35 28
      tooling/bundler/src/bundle/windows/msi/wix.rs

+ 5 - 0
.changes/fix-dll-resource.md

@@ -0,0 +1,5 @@
+---
+"tauri-bundler": patch
+---
+
+Fixes DLL resource usage on Windows.

+ 35 - 28
tooling/bundler/src/bundle/windows/msi/wix.rs

@@ -796,34 +796,7 @@ fn generate_resource_data(settings: &Settings) -> crate::Result<ResourceMap> {
   let mut resources = ResourceMap::new();
   let cwd = std::env::current_dir()?;
 
-  let mut dlls = vec![];
-  for dll in glob::glob(
-    settings
-      .project_out_directory()
-      .join("*.dll")
-      .to_string_lossy()
-      .to_string()
-      .as_str(),
-  )? {
-    let path = dll?;
-    let resource_path = path.to_string_lossy().to_string();
-    dlls.push(ResourceFile {
-      id: format!("I{}", Uuid::new_v4().as_simple()),
-      guid: Uuid::new_v4().to_string(),
-      path: resource_path,
-    });
-  }
-  if !dlls.is_empty() {
-    resources.insert(
-      "".to_string(),
-      ResourceDirectory {
-        path: "".to_string(),
-        name: "".to_string(),
-        directories: vec![],
-        files: dlls,
-      },
-    );
-  }
+  let mut added_resources = Vec::new();
 
   for src in settings.resource_files() {
     let src = src?;
@@ -834,6 +807,8 @@ fn generate_resource_data(settings: &Settings) -> crate::Result<ResourceMap> {
       .into_string()
       .expect("failed to read resource path");
 
+    added_resources.push(resource_path.clone());
+
     let resource_entry = ResourceFile {
       id: format!("I{}", Uuid::new_v4().as_simple()),
       guid: Uuid::new_v4().to_string(),
@@ -904,5 +879,37 @@ fn generate_resource_data(settings: &Settings) -> crate::Result<ResourceMap> {
     directory_entry.add_file(resource_entry);
   }
 
+  let mut dlls = Vec::new();
+
+  let out_dir = settings.project_out_directory();
+  for dll in glob::glob(out_dir.join("*.dll").to_string_lossy().to_string().as_str())? {
+    let path = dll?;
+    let resource_path = path.to_string_lossy().into_owned();
+    let relative_path = path
+      .strip_prefix(&out_dir)
+      .unwrap()
+      .to_string_lossy()
+      .into_owned();
+    if !added_resources.iter().any(|r| r.ends_with(&relative_path)) {
+      dlls.push(ResourceFile {
+        id: format!("I{}", Uuid::new_v4().as_simple()),
+        guid: Uuid::new_v4().to_string(),
+        path: resource_path,
+      });
+    }
+  }
+
+  if !dlls.is_empty() {
+    resources.insert(
+      "".to_string(),
+      ResourceDirectory {
+        path: "".to_string(),
+        name: "".to_string(),
+        directories: vec![],
+        files: dlls,
+      },
+    );
+  }
+
   Ok(resources)
 }