diff --git a/.changes/fix-mobile-identifier-changes.md b/.changes/fix-mobile-identifier-changes.md new file mode 100644 index 000000000000..ab0c0866cb64 --- /dev/null +++ b/.changes/fix-mobile-identifier-changes.md @@ -0,0 +1,6 @@ +--- +"tauri-cli": patch:bug +"@tauri-apps/cli": patch:bug +--- + +Fixes Android and iOS dev/build commands not working when the app identifier is being modified by the `--config` option. diff --git a/crates/tauri-cli/src/helpers/config.rs b/crates/tauri-cli/src/helpers/config.rs index f502bd491cdc..1404650c2333 100644 --- a/crates/tauri-cli/src/helpers/config.rs +++ b/crates/tauri-cli/src/helpers/config.rs @@ -22,6 +22,8 @@ pub const MERGE_CONFIG_EXTENSION_NAME: &str = "--config"; pub struct ConfigMetadata { /// The current target. target: Target, + + original_identifier: Option, /// The actual configuration, merged with any extension. inner: Config, /// The config extensions (platform-specific config files or the config CLI argument). @@ -39,15 +41,17 @@ impl std::ops::Deref for ConfigMetadata { } impl ConfigMetadata { + /// The original bundle identifier from the config file. + /// This does not take any extensions into account. + pub fn original_identifier(&self) -> Option<&str> { + self.original_identifier.as_deref() + } + /// Checks which config is overwriting the bundle identifier. pub fn find_bundle_identifier_overwriter(&self) -> Option { for (ext, config) in &self.extensions { if let Some(identifier) = config .as_object() - .and_then(|config| config.get("tauri")) - .and_then(|tauri_config| tauri_config.as_object()) - .and_then(|tauri_config| tauri_config.get("bundle")) - .and_then(|bundle_config| bundle_config.as_object()) .and_then(|bundle_config| bundle_config.get("identifier")) .and_then(|id| id.as_str()) { @@ -153,6 +157,12 @@ fn get_internal( let config_file_name = config_path.file_name().unwrap().to_string_lossy(); let mut extensions = HashMap::new(); + let original_identifier = config + .as_object() + .and_then(|config| config.get("identifier")) + .and_then(|id| id.as_str()) + .map(ToString::to_string); + if let Some((platform_config, config_path)) = tauri_utils::config::parse::read_platform(target, tauri_dir)? { @@ -220,6 +230,7 @@ fn get_internal( *config_handle().lock().unwrap() = Some(ConfigMetadata { target, + original_identifier, inner: config, extensions, }); diff --git a/crates/tauri-cli/src/mobile/android/android_studio_script.rs b/crates/tauri-cli/src/mobile/android/android_studio_script.rs index 34aaa1060928..d7f3e5dc9914 100644 --- a/crates/tauri-cli/src/mobile/android/android_studio_script.rs +++ b/crates/tauri-cli/src/mobile/android/android_studio_script.rs @@ -51,7 +51,7 @@ pub fn command(options: Options) -> Result<()> { let (config, metadata, cli_options) = { let tauri_config_guard = tauri_config.lock().unwrap(); let tauri_config_ = tauri_config_guard.as_ref().unwrap(); - let cli_options = read_options(&tauri_config_.identifier); + let cli_options = read_options(tauri_config_); let (config, metadata) = get_config( &get_app( MobileTarget::Android, diff --git a/crates/tauri-cli/src/mobile/android/build.rs b/crates/tauri-cli/src/mobile/android/build.rs index be80e849a562..358042127bf3 100644 --- a/crates/tauri-cli/src/mobile/android/build.rs +++ b/crates/tauri-cli/src/mobile/android/build.rs @@ -213,10 +213,7 @@ fn run_build( config: build_options.config, target_device: None, }; - let handle = write_options( - &tauri_config.lock().unwrap().as_ref().unwrap().identifier, - cli_options, - )?; + let handle = write_options(tauri_config.lock().unwrap().as_ref().unwrap(), cli_options)?; inject_resources(config, tauri_config.lock().unwrap().as_ref().unwrap())?; diff --git a/crates/tauri-cli/src/mobile/android/dev.rs b/crates/tauri-cli/src/mobile/android/dev.rs index 70f361748508..01570851c728 100644 --- a/crates/tauri-cli/src/mobile/android/dev.rs +++ b/crates/tauri-cli/src/mobile/android/dev.rs @@ -275,10 +275,7 @@ fn run_dev( }), }; - let _handle = write_options( - &tauri_config.lock().unwrap().as_ref().unwrap().identifier, - cli_options, - )?; + let _handle = write_options(tauri_config.lock().unwrap().as_ref().unwrap(), cli_options)?; inject_resources(config, tauri_config.lock().unwrap().as_ref().unwrap())?; diff --git a/crates/tauri-cli/src/mobile/ios/build.rs b/crates/tauri-cli/src/mobile/ios/build.rs index 7766b2d00a2d..27ff18ba1cab 100644 --- a/crates/tauri-cli/src/mobile/ios/build.rs +++ b/crates/tauri-cli/src/mobile/ios/build.rs @@ -295,10 +295,7 @@ fn run_build( config: build_options.config.clone(), target_device: None, }; - let handle = write_options( - &tauri_config.lock().unwrap().as_ref().unwrap().identifier, - cli_options, - )?; + let handle = write_options(tauri_config.lock().unwrap().as_ref().unwrap(), cli_options)?; if options.open { return Ok(handle); diff --git a/crates/tauri-cli/src/mobile/ios/dev.rs b/crates/tauri-cli/src/mobile/ios/dev.rs index 38569b814297..ae3f1e4301ef 100644 --- a/crates/tauri-cli/src/mobile/ios/dev.rs +++ b/crates/tauri-cli/src/mobile/ios/dev.rs @@ -279,10 +279,7 @@ fn run_dev( config: dev_options.config.clone(), target_device: None, }; - let _handle = write_options( - &tauri_config.lock().unwrap().as_ref().unwrap().identifier, - cli_options, - )?; + let _handle = write_options(tauri_config.lock().unwrap().as_ref().unwrap(), cli_options)?; let open_xcode = || { if !set_host { diff --git a/crates/tauri-cli/src/mobile/ios/xcode_script.rs b/crates/tauri-cli/src/mobile/ios/xcode_script.rs index 18e00794cb36..2473bbf0736b 100644 --- a/crates/tauri-cli/src/mobile/ios/xcode_script.rs +++ b/crates/tauri-cli/src/mobile/ios/xcode_script.rs @@ -87,7 +87,7 @@ pub fn command(options: Options) -> Result<()> { let (config, metadata, cli_options) = { let tauri_config_guard = tauri_config.lock().unwrap(); let tauri_config_ = tauri_config_guard.as_ref().unwrap(); - let cli_options = read_options(&tauri_config_.identifier); + let cli_options = read_options(tauri_config_); let (config, metadata) = get_config( &get_app( MobileTarget::Ios, diff --git a/crates/tauri-cli/src/mobile/mod.rs b/crates/tauri-cli/src/mobile/mod.rs index 10300a208f9a..abdd9610779f 100644 --- a/crates/tauri-cli/src/mobile/mod.rs +++ b/crates/tauri-cli/src/mobile/mod.rs @@ -5,12 +5,11 @@ use crate::{ helpers::{ app_paths::tauri_dir, - config::{reload as reload_config, Config as TauriConfig, ConfigHandle}, + config::{reload as reload_config, Config as TauriConfig, ConfigHandle, ConfigMetadata}, }, interface::{AppInterface, AppSettings, DevProcess, Interface, Options as InterfaceOptions}, ConfigValue, }; -#[cfg(unix)] use anyhow::Context; use anyhow::{bail, Result}; use heck::ToSnekCase; @@ -365,7 +364,10 @@ fn env() -> Result { pub struct OptionsHandle(#[allow(unused)] Runtime, #[allow(unused)] ServerHandle); /// Writes CLI options to be used later on the Xcode and Android Studio build commands -pub fn write_options(identifier: &str, mut options: CliOptions) -> crate::Result { +pub fn write_options( + config: &ConfigMetadata, + mut options: CliOptions, +) -> crate::Result { options.vars.extend(env_vars()); let runtime = Runtime::new().unwrap(); @@ -383,18 +385,28 @@ pub fn write_options(identifier: &str, mut options: CliOptions) -> crate::Result let (handle, addr) = r?; write( - temp_dir().join(format!("{identifier}-server-addr")), + temp_dir().join(format!( + "{}-server-addr", + config + .original_identifier() + .context("app configuration is missing an identifier")? + )), addr.to_string(), )?; Ok(OptionsHandle(runtime, handle)) } -fn read_options(identifier: &str) -> CliOptions { +fn read_options(config: &ConfigMetadata) -> CliOptions { let runtime = tokio::runtime::Runtime::new().unwrap(); let options = runtime .block_on(async move { - let addr_path = temp_dir().join(format!("{identifier}-server-addr")); + let addr_path = temp_dir().join(format!( + "{}-server-addr", + config + .original_identifier() + .context("app configuration is missing an identifier")? + )); let (tx, rx) = WsTransportClientBuilder::default() .build( format!(