From 44b0ba69d3b0b2822066fd939824ed0f683e27f4 Mon Sep 17 00:00:00 2001 From: Lucas Nogueira Date: Tue, 17 Jun 2025 10:27:42 -0300 Subject: [PATCH 1/2] fix(cli): read original identifier to fix mobile options reading the iOS and Android CLI commands leverage an android_studio_script/xcode_script that is executed by the native IDE or build tool. This script reads the Tauri configuration to find the app identifier used to communicate with the parent Tauri CLI process to read CLI options. The communication is broken when the `--config` arg is used, since the IDE script does not have access to that value before reaching the parent process, which is impossible without knowing the actual identifier used. To bypass this we'll agree on using the original identifier. This obviously won't work if the original tauri.conf.json do not have an identifier, so we error out in this case --- .changes/fix-mobile-identifier-changes.md | 6 +++++ crates/tauri-cli/src/helpers/config.rs | 19 +++++++++++---- .../mobile/android/android_studio_script.rs | 2 +- crates/tauri-cli/src/mobile/android/build.rs | 5 +--- crates/tauri-cli/src/mobile/android/dev.rs | 5 +--- crates/tauri-cli/src/mobile/ios/build.rs | 5 +--- crates/tauri-cli/src/mobile/ios/dev.rs | 5 +--- .../tauri-cli/src/mobile/ios/xcode_script.rs | 2 +- crates/tauri-cli/src/mobile/mod.rs | 23 +++++++++++++++---- 9 files changed, 45 insertions(+), 27 deletions(-) create mode 100644 .changes/fix-mobile-identifier-changes.md 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..7f90adf3f2f5 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..e4b870aa4cd6 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..becf05917c9c 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..9579ea4dcbd1 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..b23ac5d1097d 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..60d0a561b653 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..07a03436a31e 100644 --- a/crates/tauri-cli/src/mobile/mod.rs +++ b/crates/tauri-cli/src/mobile/mod.rs @@ -5,7 +5,7 @@ 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, @@ -365,7 +365,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 +386,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!( From eba21563ca511b97ec0e4e14630ce982726475e9 Mon Sep 17 00:00:00 2001 From: Lucas Nogueira Date: Tue, 17 Jun 2025 12:21:50 -0300 Subject: [PATCH 2/2] fix build, lint --- crates/tauri-cli/src/mobile/android/android_studio_script.rs | 2 +- crates/tauri-cli/src/mobile/android/build.rs | 2 +- crates/tauri-cli/src/mobile/android/dev.rs | 2 +- crates/tauri-cli/src/mobile/ios/build.rs | 2 +- crates/tauri-cli/src/mobile/ios/dev.rs | 2 +- crates/tauri-cli/src/mobile/ios/xcode_script.rs | 2 +- crates/tauri-cli/src/mobile/mod.rs | 1 - 7 files changed, 6 insertions(+), 7 deletions(-) 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 7f90adf3f2f5..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_); + 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 e4b870aa4cd6..358042127bf3 100644 --- a/crates/tauri-cli/src/mobile/android/build.rs +++ b/crates/tauri-cli/src/mobile/android/build.rs @@ -213,7 +213,7 @@ fn run_build( config: build_options.config, target_device: None, }; - let handle = write_options(&tauri_config.lock().unwrap().as_ref().unwrap(), 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 becf05917c9c..01570851c728 100644 --- a/crates/tauri-cli/src/mobile/android/dev.rs +++ b/crates/tauri-cli/src/mobile/android/dev.rs @@ -275,7 +275,7 @@ fn run_dev( }), }; - let _handle = write_options(&tauri_config.lock().unwrap().as_ref().unwrap(), 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 9579ea4dcbd1..27ff18ba1cab 100644 --- a/crates/tauri-cli/src/mobile/ios/build.rs +++ b/crates/tauri-cli/src/mobile/ios/build.rs @@ -295,7 +295,7 @@ fn run_build( config: build_options.config.clone(), target_device: None, }; - let handle = write_options(&tauri_config.lock().unwrap().as_ref().unwrap(), 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 b23ac5d1097d..ae3f1e4301ef 100644 --- a/crates/tauri-cli/src/mobile/ios/dev.rs +++ b/crates/tauri-cli/src/mobile/ios/dev.rs @@ -279,7 +279,7 @@ fn run_dev( config: dev_options.config.clone(), target_device: None, }; - let _handle = write_options(&tauri_config.lock().unwrap().as_ref().unwrap(), 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 60d0a561b653..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_); + 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 07a03436a31e..abdd9610779f 100644 --- a/crates/tauri-cli/src/mobile/mod.rs +++ b/crates/tauri-cli/src/mobile/mod.rs @@ -10,7 +10,6 @@ use crate::{ interface::{AppInterface, AppSettings, DevProcess, Interface, Options as InterfaceOptions}, ConfigValue, }; -#[cfg(unix)] use anyhow::Context; use anyhow::{bail, Result}; use heck::ToSnekCase;