Fix asset location for linux bundles (#4460)

* fix linux bundle

* fix release mode

* fix resource path

* only use asset dir if it exists

* add comment about directory structure

* don't unwrap parent
This commit is contained in:
Evan Almloff authored and GitHub committed 2025-07-23 17:47:41 -07:00
1 parent 66c2dac38f
commit 15d369f10f
3 files changed
+28 -2

No files matched your search

+20 -1
View File
@@ -80,7 +80,7 @@ pub fn serve_asset(path: &str) -> Result<Response<Vec<u8>>, AssetServeError> {
/// - [x] Windows /// - [x] Windows
/// - [x] Linux (appimage) /// - [x] Linux (appimage)
/// - [ ] Linux (rpm) /// - [ ] Linux (rpm)
/// - [ ] Linux (deb) /// - [x] Linux (deb)
/// - [ ] Android /// - [ ] Android
#[allow(unreachable_code)] #[allow(unreachable_code)]
fn get_asset_root() -> PathBuf { fn get_asset_root() -> PathBuf {
@@ -96,6 +96,25 @@ fn get_asset_root() -> PathBuf {
.join("Resources"); .join("Resources");
} }
#[cfg(target_os = "linux")]
{
// In linux bundles, the assets are placed in the lib/$product_name directory
// bin/
// main
// lib/
// $product_name/
// assets/
if let Some(product_name) = dioxus_cli_config::product_name() {
let lib_asset_path = || {
let path = cur_exe.parent()?.parent()?.join("lib").join(product_name);
path.exists().then_some(path)
};
if let Some(asset_dir) = lib_asset_path() {
return asset_dir;
}
}
}
// For all others, the structure looks like this: // For all others, the structure looks like this:
// app.(exe/appimage) // app.(exe/appimage)
// main.exe // main.exe
+6
View File
@@ -64,6 +64,7 @@ pub const DEVSERVER_PORT_ENV: &str = "DIOXUS_DEVSERVER_PORT";
pub const ALWAYS_ON_TOP_ENV: &str = "DIOXUS_ALWAYS_ON_TOP"; pub const ALWAYS_ON_TOP_ENV: &str = "DIOXUS_ALWAYS_ON_TOP";
pub const ASSET_ROOT_ENV: &str = "DIOXUS_ASSET_ROOT"; pub const ASSET_ROOT_ENV: &str = "DIOXUS_ASSET_ROOT";
pub const APP_TITLE_ENV: &str = "DIOXUS_APP_TITLE"; pub const APP_TITLE_ENV: &str = "DIOXUS_APP_TITLE";
pub const PRODUCT_NAME_ENV: &str = "DIOXUS_PRODUCT_NAME";
#[deprecated(since = "0.6.0", note = "The CLI currently does not set this.")] #[deprecated(since = "0.6.0", note = "The CLI currently does not set this.")]
#[doc(hidden)] #[doc(hidden)]
@@ -327,3 +328,8 @@ pub fn build_id() -> u64 {
.unwrap_or(0) .unwrap_or(0)
} }
} }
/// The product name of the bundled application.
pub fn product_name() -> Option<String> {
read_env_config!("DIOXUS_PRODUCT_NAME")
}
+2 -1
View File
@@ -323,7 +323,7 @@ use crate::{
use anyhow::{bail, Context}; use anyhow::{bail, Context};
use cargo_metadata::diagnostic::Diagnostic; use cargo_metadata::diagnostic::Diagnostic;
use depinfo::RustcDepInfo; use depinfo::RustcDepInfo;
use dioxus_cli_config::format_base_path_meta_element; use dioxus_cli_config::{format_base_path_meta_element, PRODUCT_NAME_ENV};
use dioxus_cli_config::{APP_TITLE_ENV, ASSET_ROOT_ENV}; use dioxus_cli_config::{APP_TITLE_ENV, ASSET_ROOT_ENV};
use dioxus_cli_opt::{process_file_to, AssetManifest}; use dioxus_cli_opt::{process_file_to, AssetManifest};
use itertools::Itertools; use itertools::Itertools;
@@ -2423,6 +2423,7 @@ impl BuildRequest {
env_vars.push((ASSET_ROOT_ENV.into(), base_path.to_string())); env_vars.push((ASSET_ROOT_ENV.into(), base_path.to_string()));
} }
env_vars.push((APP_TITLE_ENV.into(), self.config.web.app.title.clone())); env_vars.push((APP_TITLE_ENV.into(), self.config.web.app.title.clone()));
env_vars.push((PRODUCT_NAME_ENV.into(), self.bundled_app_name()));
} }
// Assemble the rustflags by peering into the `.cargo/config.toml` file // Assemble the rustflags by peering into the `.cargo/config.toml` file