diff --git a/.changes/fix-wix-resources.md b/.changes/fix-wix-resources.md new file mode 100644 index 000000000..5239c020d --- /dev/null +++ b/.changes/fix-wix-resources.md @@ -0,0 +1,5 @@ +--- +"tauri-bundler": patch +--- + +Properly bundle resources with nested folder structure. diff --git a/tooling/bundler/src/bundle/windows/msi/wix.rs b/tooling/bundler/src/bundle/windows/msi/wix.rs index 99641621d..1f7ec0326 100644 --- a/tooling/bundler/src/bundle/windows/msi/wix.rs +++ b/tooling/bundler/src/bundle/windows/msi/wix.rs @@ -486,6 +486,7 @@ pub fn build_wix_app_installer( data.insert("binaries", binaries_json); let resources = generate_resource_data(settings)?; + println!("{:?}", serde_json::to_string(&resources).unwrap()); let mut resources_wix_string = String::from(""); let mut files_ids = Vec::new(); for (_, dir) in resources { @@ -703,19 +704,35 @@ fn generate_resource_data(settings: &Settings) -> crate::Result { }; // split the resource path directories - let mut directories = src + let directories = src .components() .filter(|component| { let comp = component.as_os_str(); comp != "." && comp != ".." }) .collect::>(); - directories.truncate(directories.len() - 1); // transform the directory structure to a chained vec structure let first_directory = directories .first() .map(|d| d.as_os_str().to_string_lossy().into_owned()) .unwrap_or_else(String::new); + + if !resources.contains_key(&first_directory) { + resources.insert( + first_directory.clone(), + ResourceDirectory { + path: first_directory.clone(), + name: first_directory.clone(), + directories: vec![], + files: vec![], + }, + ); + } + + let mut directory_entry = resources + .get_mut(&first_directory) + .expect("Unable to handle resources"); + let last_index = directories.len() - 1; let mut path = String::new(); for (i, directory) in directories.into_iter().enumerate() { @@ -725,57 +742,30 @@ fn generate_resource_data(settings: &Settings) -> crate::Result { .into_string() .expect("failed to read resource folder name"); path.push_str(directory_name.as_str()); + path.push(std::path::MAIN_SEPARATOR); - // if the directory is already on the map - if resources.contains_key(&first_directory) { - let directory_entry = &mut resources - .get_mut(&first_directory) - .expect("Unable to handle resources"); - if last_index == 0 { - // the directory entry is the root of the chain - directory_entry.add_file(resource_entry.clone()); - } else { - let index = directory_entry - .directories - .iter() - .position(|f| f.path == path); - if let Some(index) = index { - // the directory entry is already a part of the chain - if i == last_index { - let dir = directory_entry - .directories - .get_mut(index) - .expect("Unable to get directory"); - dir.add_file(resource_entry.clone()); - } - } else { - // push it to the chain + if i == last_index { + directory_entry.add_file(resource_entry); + break; + } else if i == 0 { + continue; + } else { + let index = directory_entry + .directories + .iter() + .position(|f| f.path == path); + match index { + Some(i) => directory_entry = directory_entry.directories.iter_mut().nth(i).unwrap(), + None => { directory_entry.directories.push(ResourceDirectory { path: path.clone(), - name: directory_name.clone(), + name: directory_name, directories: vec![], - files: if i == last_index { - vec![resource_entry.clone()] - } else { - vec![] - }, + files: vec![], }); + directory_entry = directory_entry.directories.iter_mut().last().unwrap(); } } - } else { - resources.insert( - directory_name.clone(), - ResourceDirectory { - path: path.clone(), - name: directory_name.clone(), - directories: vec![], - files: if i == last_index { - vec![resource_entry.clone()] - } else { - vec![] - }, - }, - ); } } }