From d453e2e06a6556c8aa6d46a86a4bdbdcdba80677 Mon Sep 17 00:00:00 2001 From: sftse Date: Thu, 29 Jan 2026 03:35:55 +0100 Subject: [PATCH 1/3] refactor(tauri-cli): remove trait implemented only once (#14840) --- crates/tauri-cli/src/build.rs | 2 +- crates/tauri-cli/src/bundle.rs | 2 +- crates/tauri-cli/src/dev.rs | 2 +- crates/tauri-cli/src/helpers/mod.rs | 5 +-- crates/tauri-cli/src/inspect.rs | 2 +- crates/tauri-cli/src/interface/mod.rs | 39 +------------------ crates/tauri-cli/src/interface/rust.rs | 20 +++++----- .../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/android/run.rs | 2 +- crates/tauri-cli/src/mobile/init.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/run.rs | 2 +- .../tauri-cli/src/mobile/ios/xcode_script.rs | 2 +- crates/tauri-cli/src/mobile/mod.rs | 2 +- 17 files changed, 25 insertions(+), 67 deletions(-) diff --git a/crates/tauri-cli/src/build.rs b/crates/tauri-cli/src/build.rs index b43b3c9ae62a..627fd763ac90 100644 --- a/crates/tauri-cli/src/build.rs +++ b/crates/tauri-cli/src/build.rs @@ -11,7 +11,7 @@ use crate::{ config::{get_config, ConfigMetadata, FrontendDist}, }, info::plugins::check_mismatched_packages, - interface::{rust::get_cargo_target_dir, AppInterface, Interface}, + interface::{rust::get_cargo_target_dir, AppInterface}, ConfigValue, Result, }; use clap::{ArgAction, Parser}; diff --git a/crates/tauri-cli/src/bundle.rs b/crates/tauri-cli/src/bundle.rs index 638c215e9747..4d3637ab58ba 100644 --- a/crates/tauri-cli/src/bundle.rs +++ b/crates/tauri-cli/src/bundle.rs @@ -20,7 +20,7 @@ use crate::{ config::{get_config, ConfigMetadata}, updater_signature, }, - interface::{AppInterface, AppSettings, Interface}, + interface::{AppInterface, AppSettings}, ConfigValue, }; diff --git a/crates/tauri-cli/src/dev.rs b/crates/tauri-cli/src/dev.rs index a66186919fc4..56dacf96f6ce 100644 --- a/crates/tauri-cli/src/dev.rs +++ b/crates/tauri-cli/src/dev.rs @@ -10,7 +10,7 @@ use crate::{ config::{get_config, reload_config, BeforeDevCommand, ConfigMetadata, FrontendDist}, }, info::plugins::check_mismatched_packages, - interface::{AppInterface, ExitReason, Interface}, + interface::{AppInterface, ExitReason}, CommandExt, ConfigValue, Error, Result, }; diff --git a/crates/tauri-cli/src/helpers/mod.rs b/crates/tauri-cli/src/helpers/mod.rs index 3d2a5f0e9211..05ea0010902d 100644 --- a/crates/tauri-cli/src/helpers/mod.rs +++ b/crates/tauri-cli/src/helpers/mod.rs @@ -30,10 +30,7 @@ use tauri_utils::config::HookCommand; #[cfg(not(target_os = "windows"))] use crate::Error; -use crate::{ - interface::{AppInterface, Interface}, - CommandExt, -}; +use crate::{interface::AppInterface, CommandExt}; pub fn command_env(debug: bool) -> HashMap<&'static str, String> { let mut map = HashMap::new(); diff --git a/crates/tauri-cli/src/inspect.rs b/crates/tauri-cli/src/inspect.rs index de26dd98443a..1e2334965856 100644 --- a/crates/tauri-cli/src/inspect.rs +++ b/crates/tauri-cli/src/inspect.rs @@ -6,7 +6,7 @@ use std::path::Path; use crate::Result; use clap::{Parser, Subcommand}; -use crate::interface::{AppInterface, AppSettings, Interface}; +use crate::interface::{AppInterface, AppSettings}; #[derive(Debug, Parser)] #[clap(about = "Inspect values used by Tauri")] diff --git a/crates/tauri-cli/src/interface/mod.rs b/crates/tauri-cli/src/interface/mod.rs index dc15e7ecb94a..f10bef0300ab 100644 --- a/crates/tauri-cli/src/interface/mod.rs +++ b/crates/tauri-cli/src/interface/mod.rs @@ -5,16 +5,11 @@ pub mod rust; use std::{ - collections::HashMap, path::{Path, PathBuf}, process::ExitStatus, - sync::Arc, }; -use crate::{ - error::Context, helpers::app_paths::Dirs, helpers::config::Config, - helpers::config::ConfigMetadata, -}; +use crate::{error::Context, helpers::config::Config}; use tauri_bundler::bundle::{PackageType, Settings, SettingsBuilder}; pub use rust::{MobileOptions, Options, Rust as AppInterface, WatcherOptions}; @@ -104,35 +99,3 @@ pub enum ExitReason { /// Regular exit. NormalExit, } - -pub trait Interface: Sized { - type AppSettings: AppSettings; - - fn new(config: &Config, target: Option, tauri_dir: &Path) -> crate::Result; - fn app_settings(&self) -> Arc; - fn env(&self) -> HashMap<&str, String>; - fn build(&mut self, options: Options, dirs: &Dirs) -> crate::Result; - fn dev, ExitReason) + Send + Sync + 'static>( - &mut self, - config: &mut ConfigMetadata, - options: Options, - on_exit: F, - dirs: &Dirs, - ) -> crate::Result<()>; - fn mobile_dev< - R: Fn(MobileOptions, &ConfigMetadata) -> crate::Result>, - >( - &mut self, - config: &mut ConfigMetadata, - options: MobileOptions, - runner: R, - dirs: &Dirs, - ) -> crate::Result<()>; - fn watch crate::Result>>( - &mut self, - config: &mut ConfigMetadata, - options: WatcherOptions, - runner: R, - dirs: &Dirs, - ) -> crate::Result<()>; -} diff --git a/crates/tauri-cli/src/interface/rust.rs b/crates/tauri-cli/src/interface/rust.rs index 3878b884560d..d1bb2ebbecba 100644 --- a/crates/tauri-cli/src/interface/rust.rs +++ b/crates/tauri-cli/src/interface/rust.rs @@ -27,7 +27,7 @@ use tauri_bundler::{ }; use tauri_utils::config::{parse::is_configuration_file, DeepLinkProtocol, RunnerConfig, Updater}; -use super::{AppSettings, DevProcess, ExitReason, Interface}; +use super::{AppSettings, DevProcess, ExitReason}; use crate::{ error::{Context, Error, ErrorExt}, helpers::{ @@ -134,10 +134,8 @@ pub struct Rust { main_binary_name: Option, } -impl Interface for Rust { - type AppSettings = RustAppSettings; - - fn new(config: &Config, target: Option, tauri_dir: &Path) -> crate::Result { +impl Rust { + pub fn new(config: &Config, target: Option, tauri_dir: &Path) -> crate::Result { let manifest = { let (tx, rx) = sync_channel(1); let mut watcher = new_debouncer(Duration::from_secs(1), None, move |r| { @@ -177,11 +175,11 @@ impl Interface for Rust { }) } - fn app_settings(&self) -> Arc { + pub fn app_settings(&self) -> Arc { self.app_settings.clone() } - fn build(&mut self, options: Options, dirs: &Dirs) -> crate::Result { + pub fn build(&mut self, options: Options, dirs: &Dirs) -> crate::Result { desktop::build( options, &self.app_settings, @@ -192,7 +190,7 @@ impl Interface for Rust { ) } - fn dev, ExitReason) + Send + Sync + 'static>( + pub fn dev, ExitReason) + Send + Sync + 'static>( &mut self, config: &mut ConfigMetadata, mut options: Options, @@ -236,7 +234,7 @@ impl Interface for Rust { } } - fn mobile_dev< + pub fn mobile_dev< R: Fn(MobileOptions, &ConfigMetadata) -> crate::Result>, >( &mut self, @@ -270,7 +268,7 @@ impl Interface for Rust { } } - fn watch crate::Result>>( + pub fn watch crate::Result>>( &mut self, config: &mut ConfigMetadata, options: WatcherOptions, @@ -287,7 +285,7 @@ impl Interface for Rust { ) } - fn env(&self) -> HashMap<&str, String> { + pub fn env(&self) -> HashMap<&str, String> { let mut env = HashMap::new(); env.insert( "TAURI_ENV_TARGET_TRIPLE", 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 ce1d6ba8ef05..2240a3a95af3 100644 --- a/crates/tauri-cli/src/mobile/android/android_studio_script.rs +++ b/crates/tauri-cli/src/mobile/android/android_studio_script.rs @@ -6,7 +6,7 @@ use super::{detect_target_ok, ensure_init, env, get_app, get_config, read_option use crate::{ error::{Context, ErrorExt}, helpers::config::{get_config as get_tauri_config, reload_config as reload_tauri_config}, - interface::{AppInterface, Interface}, + interface::AppInterface, mobile::CliOptions, Error, Result, }; diff --git a/crates/tauri-cli/src/mobile/android/build.rs b/crates/tauri-cli/src/mobile/android/build.rs index 7b85ef47d170..be91b612b290 100644 --- a/crates/tauri-cli/src/mobile/android/build.rs +++ b/crates/tauri-cli/src/mobile/android/build.rs @@ -14,7 +14,7 @@ use crate::{ config::{get_config as get_tauri_config, ConfigMetadata}, flock, }, - interface::{AppInterface, Interface, Options as InterfaceOptions}, + interface::{AppInterface, Options as InterfaceOptions}, mobile::{android::generate_tauri_properties, write_options, CliOptions, TargetDevice}, ConfigValue, Error, Result, }; diff --git a/crates/tauri-cli/src/mobile/android/dev.rs b/crates/tauri-cli/src/mobile/android/dev.rs index a4cfaacd4180..b17e141c2dad 100644 --- a/crates/tauri-cli/src/mobile/android/dev.rs +++ b/crates/tauri-cli/src/mobile/android/dev.rs @@ -14,7 +14,7 @@ use crate::{ config::{get_config as get_tauri_config, ConfigMetadata}, flock, }, - interface::{AppInterface, Interface, MobileOptions, Options as InterfaceOptions}, + interface::{AppInterface, MobileOptions, Options as InterfaceOptions}, mobile::{ android::generate_tauri_properties, use_network_address_for_dev_url, write_options, CliOptions, DevChild, DevHost, DevProcess, TargetDevice, diff --git a/crates/tauri-cli/src/mobile/android/run.rs b/crates/tauri-cli/src/mobile/android/run.rs index c07c6ba6ddc8..c77596b03877 100644 --- a/crates/tauri-cli/src/mobile/android/run.rs +++ b/crates/tauri-cli/src/mobile/android/run.rs @@ -14,7 +14,7 @@ use super::{configure_cargo, device_prompt, env}; use crate::{ error::Context, helpers::config::ConfigMetadata, - interface::{DevProcess, Interface, WatcherOptions}, + interface::{DevProcess, WatcherOptions}, mobile::{DevChild, TargetDevice}, ConfigValue, Result, }; diff --git a/crates/tauri-cli/src/mobile/init.rs b/crates/tauri-cli/src/mobile/init.rs index f187b9f12f8b..7ace53b512a4 100644 --- a/crates/tauri-cli/src/mobile/init.rs +++ b/crates/tauri-cli/src/mobile/init.rs @@ -6,7 +6,7 @@ use super::{get_app, Target}; use crate::{ helpers::app_paths::Dirs, helpers::{config::get_config as get_tauri_config, template::JsonMap}, - interface::{AppInterface, Interface}, + interface::AppInterface, ConfigValue, Result, }; use cargo_mobile2::{ diff --git a/crates/tauri-cli/src/mobile/ios/build.rs b/crates/tauri-cli/src/mobile/ios/build.rs index 5ad7e58d52a7..934f47cdaf4d 100644 --- a/crates/tauri-cli/src/mobile/ios/build.rs +++ b/crates/tauri-cli/src/mobile/ios/build.rs @@ -16,7 +16,7 @@ use crate::{ flock, plist::merge_plist, }, - interface::{AppInterface, Interface, Options as InterfaceOptions}, + interface::{AppInterface, Options as InterfaceOptions}, mobile::{ios::ensure_ios_runtime_installed, write_options, CliOptions, TargetDevice}, ConfigValue, Error, Result, }; diff --git a/crates/tauri-cli/src/mobile/ios/dev.rs b/crates/tauri-cli/src/mobile/ios/dev.rs index 397875ac2ace..d530b528c657 100644 --- a/crates/tauri-cli/src/mobile/ios/dev.rs +++ b/crates/tauri-cli/src/mobile/ios/dev.rs @@ -15,7 +15,7 @@ use crate::{ flock, plist::merge_plist, }, - interface::{AppInterface, Interface, MobileOptions, Options as InterfaceOptions}, + interface::{AppInterface, MobileOptions, Options as InterfaceOptions}, mobile::{ ios::ensure_ios_runtime_installed, use_network_address_for_dev_url, write_options, CliOptions, DevChild, DevHost, DevProcess, diff --git a/crates/tauri-cli/src/mobile/ios/run.rs b/crates/tauri-cli/src/mobile/ios/run.rs index 0021ef8683e4..61e696ef94a1 100644 --- a/crates/tauri-cli/src/mobile/ios/run.rs +++ b/crates/tauri-cli/src/mobile/ios/run.rs @@ -11,7 +11,7 @@ use super::{device_prompt, env}; use crate::{ error::Context, helpers::config::{get_config as get_tauri_config, ConfigMetadata}, - interface::{DevProcess, Interface, WatcherOptions}, + interface::{DevProcess, WatcherOptions}, mobile::{DevChild, TargetDevice}, ConfigValue, Result, }; diff --git a/crates/tauri-cli/src/mobile/ios/xcode_script.rs b/crates/tauri-cli/src/mobile/ios/xcode_script.rs index 0b30ba2f447f..41294150940f 100644 --- a/crates/tauri-cli/src/mobile/ios/xcode_script.rs +++ b/crates/tauri-cli/src/mobile/ios/xcode_script.rs @@ -6,7 +6,7 @@ use super::{ensure_init, env, get_app, get_config, read_options, MobileTarget}; use crate::{ error::{Context, ErrorExt}, helpers::config::{get_config as get_tauri_config, reload_config as reload_tauri_config}, - interface::{AppInterface, Interface, Options as InterfaceOptions}, + interface::{AppInterface, Options as InterfaceOptions}, mobile::ios::LIB_OUTPUT_FILE_NAME, Error, Result, }; diff --git a/crates/tauri-cli/src/mobile/mod.rs b/crates/tauri-cli/src/mobile/mod.rs index 6b06e0cac4c5..0191ead147b7 100644 --- a/crates/tauri-cli/src/mobile/mod.rs +++ b/crates/tauri-cli/src/mobile/mod.rs @@ -5,7 +5,7 @@ use crate::{ error::{Context, ErrorExt}, helpers::config::{reload_config, Config as TauriConfig, ConfigMetadata}, - interface::{AppInterface, AppSettings, DevProcess, Interface, Options as InterfaceOptions}, + interface::{AppInterface, AppSettings, DevProcess, Options as InterfaceOptions}, ConfigValue, Error, Result, }; use heck::ToSnekCase; From e3fdcb5002b362b46cde2a1971e4e7f2a1161208 Mon Sep 17 00:00:00 2001 From: sftse Date: Thu, 29 Jan 2026 03:39:00 +0100 Subject: [PATCH 2/3] refactor tauri-cli (#14836) * refactor(tauri-cli): use OsString where possible * refactor(tauri-cli): remove needless scoping blocks * refactor(tauri-cli): make return type concrete * refactor(tauri-cli): use ? * refactor(tauri-cli): coerce later to trait object * refactor(tauri-cli): remove clone * refactor(tauri-cli): make better use of static OnceLock * fix(tauri-cli): upgrade atomics to SeqCst * Add change file * Update .changes/change-pr-14836.md Co-authored-by: Tony <68118705+Legend-Master@users.noreply.github.com> --- .changes/change-pr-14836.md | 6 +++ crates/tauri-cli/src/dev.rs | 18 +++---- crates/tauri-cli/src/interface/rust.rs | 23 ++++---- .../tauri-cli/src/interface/rust/desktop.rs | 12 ++--- .../mobile/android/android_studio_script.rs | 23 ++++---- crates/tauri-cli/src/mobile/android/build.rs | 23 ++++---- crates/tauri-cli/src/mobile/android/dev.rs | 19 +++---- crates/tauri-cli/src/mobile/ios/build.rs | 25 ++++----- crates/tauri-cli/src/mobile/ios/dev.rs | 22 ++++---- .../tauri-cli/src/mobile/ios/xcode_script.rs | 53 ++++++++----------- crates/tauri-cli/src/mobile/mod.rs | 13 ++--- 11 files changed, 106 insertions(+), 131 deletions(-) create mode 100644 .changes/change-pr-14836.md diff --git a/.changes/change-pr-14836.md b/.changes/change-pr-14836.md new file mode 100644 index 000000000000..61215bed97dd --- /dev/null +++ b/.changes/change-pr-14836.md @@ -0,0 +1,6 @@ +--- +"@tauri-apps/cli": patch:changes +"tauri-cli": patch:changes +--- + +Continued refactors of tauri-cli, fix too weak atomics. diff --git a/crates/tauri-cli/src/dev.rs b/crates/tauri-cli/src/dev.rs index 56dacf96f6ce..d175c4c18774 100644 --- a/crates/tauri-cli/src/dev.rs +++ b/crates/tauri-cli/src/dev.rs @@ -25,13 +25,13 @@ use std::{ process::{exit, Command, Stdio}, sync::{ atomic::{AtomicBool, Ordering}, - Arc, Mutex, OnceLock, + OnceLock, }, }; mod builtin_dev_server; -static BEFORE_DEV: OnceLock>> = OnceLock::new(); +static BEFORE_DEV: OnceLock = OnceLock::new(); static KILL_BEFORE_DEV_FLAG: AtomicBool = AtomicBool::new(false); #[cfg(unix)] @@ -205,21 +205,18 @@ pub fn setup( let child = SharedChild::spawn(&mut command) .unwrap_or_else(|_| panic!("failed to run `{before_dev}`")); - let child = Arc::new(child); - let child_ = child.clone(); + let child = BEFORE_DEV.get_or_init(move || child); std::thread::spawn(move || { - let status = child_ + let status = child .wait() .expect("failed to wait on \"beforeDevCommand\""); - if !(status.success() || KILL_BEFORE_DEV_FLAG.load(Ordering::Relaxed)) { + if !(status.success() || KILL_BEFORE_DEV_FLAG.load(Ordering::SeqCst)) { log::error!("The \"beforeDevCommand\" terminated with a non-zero status code."); exit(status.code().unwrap_or(1)); } }); - BEFORE_DEV.set(Mutex::new(child)).unwrap(); - let _ = ctrlc::set_handler(move || { kill_before_dev_process(); exit(130); @@ -336,11 +333,10 @@ pub fn on_app_exit(code: Option, reason: ExitReason, exit_on_panic: bool, n pub fn kill_before_dev_process() { if let Some(child) = BEFORE_DEV.get() { - let child = child.lock().unwrap(); - if KILL_BEFORE_DEV_FLAG.load(Ordering::Relaxed) { + if KILL_BEFORE_DEV_FLAG.load(Ordering::SeqCst) { return; } - KILL_BEFORE_DEV_FLAG.store(true, Ordering::Relaxed); + KILL_BEFORE_DEV_FLAG.store(true, Ordering::SeqCst); #[cfg(windows)] { let powershell_path = std::env::var("SYSTEMROOT").map_or_else( diff --git a/crates/tauri-cli/src/interface/rust.rs b/crates/tauri-cli/src/interface/rust.rs index d1bb2ebbecba..2f0b635b19bd 100644 --- a/crates/tauri-cli/src/interface/rust.rs +++ b/crates/tauri-cli/src/interface/rust.rs @@ -210,7 +210,7 @@ impl Rust { if options.no_watch { let (tx, rx) = sync_channel(1); - self.run_dev(options, run_args, move |status, reason| { + self.run_dev(options, &run_args, move |status, reason| { on_exit(status, reason); tx.send(()).unwrap(); })?; @@ -225,9 +225,11 @@ impl Rust { &merge_configs, |rust: &mut Rust, _config| { let on_exit = on_exit.clone(); - rust.run_dev(options.clone(), run_args.clone(), move |status, reason| { - on_exit(status, reason) - }) + rust + .run_dev(options.clone(), &run_args, move |status, reason| { + on_exit(status, reason) + }) + .map(|child| Box::new(child) as Box) }, dirs, ) @@ -361,7 +363,7 @@ fn build_ignore_matcher(dir: &Path) -> IgnoreMatcher { ignore_builder.add(path); - if let Ok(ignore_file) = std::env::var("TAURI_CLI_WATCHER_IGNORE_FILENAME") { + if let Some(ignore_file) = std::env::var_os("TAURI_CLI_WATCHER_IGNORE_FILENAME") { ignore_builder.add(dir.join(ignore_file)); } @@ -393,7 +395,7 @@ fn lookup(dir: &Path, mut f: F) { let mut builder = ignore::WalkBuilder::new(dir); builder.add_custom_ignore_filename(".taurignore"); let _ = builder.add_ignore(default_gitignore); - if let Ok(ignore_file) = std::env::var("TAURI_CLI_WATCHER_IGNORE_FILENAME") { + if let Some(ignore_file) = std::env::var_os("TAURI_CLI_WATCHER_IGNORE_FILENAME") { builder.add_ignore(ignore_file); } builder.require_git(false).ignore(false).max_depth(Some(1)); @@ -490,9 +492,9 @@ impl Rust { fn run_dev, ExitReason) + Send + Sync + 'static>( &mut self, options: Options, - run_args: Vec, + run_args: &[String], on_exit: F, - ) -> crate::Result> { + ) -> crate::Result { desktop::run_dev( options, run_args, @@ -500,7 +502,6 @@ impl Rust { self.config_features.clone(), on_exit, ) - .map(|c| Box::new(c) as Box) } fn run_dev_watcher< @@ -1380,7 +1381,7 @@ fn tauri_config_to_bundle_settings( if enabled_features.contains(&"tray-icon".into()) || enabled_features.contains(&"tauri/tray-icon".into()) { - let (tray_kind, path) = std::env::var("TAURI_LINUX_AYATANA_APPINDICATOR") + let (tray_kind, path) = std::env::var_os("TAURI_LINUX_AYATANA_APPINDICATOR") .map(|ayatana| { if ayatana == "true" || ayatana == "1" { ( @@ -1402,7 +1403,7 @@ fn tauri_config_to_bundle_settings( ) } }) - .unwrap_or_else(|_| pkgconfig_utils::get_appindicator_library_path()); + .unwrap_or_else(pkgconfig_utils::get_appindicator_library_path); match tray_kind { pkgconfig_utils::TrayKind::Ayatana => { depends_deb.push("libayatana-appindicator3-1".into()); diff --git a/crates/tauri-cli/src/interface/rust/desktop.rs b/crates/tauri-cli/src/interface/rust/desktop.rs index 15cd503e6368..adddfa60f859 100644 --- a/crates/tauri-cli/src/interface/rust/desktop.rs +++ b/crates/tauri-cli/src/interface/rust/desktop.rs @@ -29,7 +29,7 @@ pub struct DevChild { impl DevProcess for DevChild { fn kill(&self) -> std::io::Result<()> { self.dev_child.kill()?; - self.manually_killed_app.store(true, Ordering::Relaxed); + self.manually_killed_app.store(true, Ordering::SeqCst); Ok(()) } @@ -42,17 +42,17 @@ impl DevProcess for DevChild { } fn manually_killed_process(&self) -> bool { - self.manually_killed_app.load(Ordering::Relaxed) + self.manually_killed_app.load(Ordering::SeqCst) } } pub fn run_dev, ExitReason) + Send + Sync + 'static>( options: Options, - run_args: Vec, + run_args: &[String], available_targets: &mut Option>, config_features: Vec, on_exit: F, -) -> crate::Result { +) -> crate::Result { let mut dev_cmd = cargo_command(true, options, available_targets, config_features)?; let runner = dev_cmd.get_program().to_string_lossy().into_owned(); @@ -137,7 +137,7 @@ pub fn run_dev, ExitReason) + Send + Sync + 'static>( status.code(), if status.code() == Some(101) && is_cargo_compile_error { ExitReason::CompilationFailed - } else if manually_killed_app_.load(Ordering::Relaxed) { + } else if manually_killed_app_.load(Ordering::SeqCst) { ExitReason::TriggeredKill } else { ExitReason::NormalExit @@ -163,7 +163,7 @@ pub fn build( let out_dir = app_settings.out_dir(&options, tauri_dir)?; let bin_path = app_settings.app_binary_path(&options, tauri_dir)?; - if !std::env::var("STATIC_VCRUNTIME").is_ok_and(|v| v == "false") { + if !std::env::var_os("STATIC_VCRUNTIME").is_some_and(|v| v == "false") { std::env::set_var("STATIC_VCRUNTIME", "true"); } 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 2240a3a95af3..321b4104144d 100644 --- a/crates/tauri-cli/src/mobile/android/android_studio_script.rs +++ b/crates/tauri-cli/src/mobile/android/android_studio_script.rs @@ -62,20 +62,17 @@ pub fn command(options: Options) -> Result<()> { )? }; - let (config, metadata) = { - let (config, metadata) = get_config( - &get_app( - MobileTarget::Android, - &tauri_config, - &AppInterface::new(&tauri_config, None, dirs.tauri)?, - dirs.tauri, - ), + let (config, metadata) = get_config( + &get_app( + MobileTarget::Android, &tauri_config, - &[], - &cli_options, - ); - (config, metadata) - }; + &AppInterface::new(&tauri_config, None, dirs.tauri)?, + dirs.tauri, + ), + &tauri_config, + &[], + &cli_options, + ); ensure_init( &tauri_config, diff --git a/crates/tauri-cli/src/mobile/android/build.rs b/crates/tauri-cli/src/mobile/android/build.rs index be91b612b290..8113ace54e32 100644 --- a/crates/tauri-cli/src/mobile/android/build.rs +++ b/crates/tauri-cli/src/mobile/android/build.rs @@ -153,19 +153,16 @@ pub fn run( .unwrap(); build_options.target = Some(first_target.triple.into()); - let (interface, config, metadata) = { - let interface = AppInterface::new(tauri_config, build_options.target.clone(), dirs.tauri)?; - interface.build_options(&mut Vec::new(), &mut build_options.features, true); - - let app = get_app(MobileTarget::Android, tauri_config, &interface, dirs.tauri); - let (config, metadata) = get_config( - &app, - tauri_config, - &build_options.features, - &Default::default(), - ); - (interface, config, metadata) - }; + let interface = AppInterface::new(tauri_config, build_options.target.clone(), dirs.tauri)?; + interface.build_options(&mut Vec::new(), &mut build_options.features, true); + + let app = get_app(MobileTarget::Android, tauri_config, &interface, dirs.tauri); + let (config, metadata) = get_config( + &app, + tauri_config, + &build_options.features, + &Default::default(), + ); let profile = if options.debug { Profile::Debug diff --git a/crates/tauri-cli/src/mobile/android/dev.rs b/crates/tauri-cli/src/mobile/android/dev.rs index b17e141c2dad..7387eb831a1c 100644 --- a/crates/tauri-cli/src/mobile/android/dev.rs +++ b/crates/tauri-cli/src/mobile/android/dev.rs @@ -183,18 +183,15 @@ fn run_command(options: Options, noise_level: NoiseLevel, dirs: Dirs) -> Result< .unwrap_or_else(|| Target::all().values().next().unwrap().triple.into()); dev_options.target = Some(target_triple); - let (interface, config, metadata) = { - let interface = AppInterface::new(&tauri_config, dev_options.target.clone(), dirs.tauri)?; + let interface = AppInterface::new(&tauri_config, dev_options.target.clone(), dirs.tauri)?; - let app = get_app(MobileTarget::Android, &tauri_config, &interface, dirs.tauri); - let (config, metadata) = get_config( - &app, - &tauri_config, - dev_options.features.as_ref(), - &Default::default(), - ); - (interface, config, metadata) - }; + let app = get_app(MobileTarget::Android, &tauri_config, &interface, dirs.tauri); + let (config, metadata) = get_config( + &app, + &tauri_config, + dev_options.features.as_ref(), + &Default::default(), + ); set_current_dir(dirs.tauri).context("failed to set current directory to Tauri directory")?; diff --git a/crates/tauri-cli/src/mobile/ios/build.rs b/crates/tauri-cli/src/mobile/ios/build.rs index 934f47cdaf4d..7e75ca462af7 100644 --- a/crates/tauri-cli/src/mobile/ios/build.rs +++ b/crates/tauri-cli/src/mobile/ios/build.rs @@ -194,20 +194,17 @@ pub fn run(options: Options, noise_level: NoiseLevel, dirs: &Dirs) -> Result>(), dirs.tauri, )?; - let (interface, mut config) = { - let interface = AppInterface::new(&tauri_config, build_options.target.clone(), dirs.tauri)?; - interface.build_options(&mut Vec::new(), &mut build_options.features, true); - - let app = get_app(MobileTarget::Ios, &tauri_config, &interface, dirs.tauri); - let (config, _metadata) = get_config( - &app, - &tauri_config, - &build_options.features, - &Default::default(), - dirs.tauri, - )?; - (interface, config) - }; + let interface = AppInterface::new(&tauri_config, build_options.target.clone(), dirs.tauri)?; + interface.build_options(&mut Vec::new(), &mut build_options.features, true); + + let app = get_app(MobileTarget::Ios, &tauri_config, &interface, dirs.tauri); + let (mut config, _) = get_config( + &app, + &tauri_config, + &build_options.features, + &Default::default(), + dirs.tauri, + )?; set_current_dir(dirs.tauri).context("failed to set current directory")?; diff --git a/crates/tauri-cli/src/mobile/ios/dev.rs b/crates/tauri-cli/src/mobile/ios/dev.rs index d530b528c657..0ef7fc083e37 100644 --- a/crates/tauri-cli/src/mobile/ios/dev.rs +++ b/crates/tauri-cli/src/mobile/ios/dev.rs @@ -188,20 +188,16 @@ fn run_command(options: Options, noise_level: NoiseLevel, dirs: Dirs) -> Result< &options.config.iter().map(|c| &c.0).collect::>(), dirs.tauri, )?; - let (interface, config) = { - let interface = AppInterface::new(&tauri_config, Some(target_triple), dirs.tauri)?; + let interface = AppInterface::new(&tauri_config, Some(target_triple), dirs.tauri)?; - let app = get_app(MobileTarget::Ios, &tauri_config, &interface, dirs.tauri); - let (config, _metadata) = get_config( - &app, - &tauri_config, - &dev_options.features, - &Default::default(), - dirs.tauri, - )?; - - (interface, config) - }; + let app = get_app(MobileTarget::Ios, &tauri_config, &interface, dirs.tauri); + let (config, _) = get_config( + &app, + &tauri_config, + &dev_options.features, + &Default::default(), + dirs.tauri, + )?; set_current_dir(dirs.tauri).context("failed to set current directory to Tauri directory")?; diff --git a/crates/tauri-cli/src/mobile/ios/xcode_script.rs b/crates/tauri-cli/src/mobile/ios/xcode_script.rs index 41294150940f..05b182d7cec1 100644 --- a/crates/tauri-cli/src/mobile/ios/xcode_script.rs +++ b/crates/tauri-cli/src/mobile/ios/xcode_script.rs @@ -95,40 +95,33 @@ pub fn command(options: Options) -> Result<()> { let macos = macos_from_platform(&options.platform); let mut tauri_config = get_tauri_config(tauri_utils::platform::Target::Ios, &[], dirs.tauri)?; - let cli_options = { - let cli_options = { read_options(&tauri_config) }; - if !cli_options.config.is_empty() { - // reload config with merges from the ios dev|build script - reload_tauri_config( - &mut tauri_config, - &cli_options - .config - .iter() - .map(|conf| &conf.0) - .collect::>(), - dirs.tauri, - )? - }; - - cli_options + let cli_options = read_options(&tauri_config); + if !cli_options.config.is_empty() { + // reload config with merges from the ios dev|build script + reload_tauri_config( + &mut tauri_config, + &cli_options + .config + .iter() + .map(|conf| &conf.0) + .collect::>(), + dirs.tauri, + )? }; - let (config, metadata) = { - let cli_options = read_options(&tauri_config); - let (config, metadata) = get_config( - &get_app( - MobileTarget::Ios, - &tauri_config, - &AppInterface::new(&tauri_config, None, dirs.tauri)?, - dirs.tauri, - ), + let (config, metadata) = get_config( + &get_app( + MobileTarget::Ios, &tauri_config, - &[], - &cli_options, + &AppInterface::new(&tauri_config, None, dirs.tauri)?, dirs.tauri, - )?; - (config, metadata) - }; + ), + &tauri_config, + &[], + &cli_options, + dirs.tauri, + )?; + ensure_init( &tauri_config, config.app(), diff --git a/crates/tauri-cli/src/mobile/mod.rs b/crates/tauri-cli/src/mobile/mod.rs index 0191ead147b7..248b16dbe68f 100644 --- a/crates/tauri-cli/src/mobile/mod.rs +++ b/crates/tauri-cli/src/mobile/mod.rs @@ -67,14 +67,9 @@ impl DevChild { impl DevProcess for DevChild { fn kill(&self) -> std::io::Result<()> { - self.manually_killed_process.store(true, Ordering::Relaxed); - match self.child.kill() { - Ok(_) => Ok(()), - Err(e) => { - self.manually_killed_process.store(false, Ordering::Relaxed); - Err(e) - } - } + self.child.kill()?; + self.manually_killed_process.store(true, Ordering::SeqCst); + Ok(()) } fn try_wait(&self) -> std::io::Result> { @@ -86,7 +81,7 @@ impl DevProcess for DevChild { } fn manually_killed_process(&self) -> bool { - self.manually_killed_process.load(Ordering::Relaxed) + self.manually_killed_process.load(Ordering::SeqCst) } } From 32576120fd4c7cb164a546c813cbb014c0b8da54 Mon Sep 17 00:00:00 2001 From: sftse Date: Thu, 29 Jan 2026 04:13:03 +0100 Subject: [PATCH 3/3] Fix busy loop (#14839) * refactor(tauri-cli): remove unneeded Arc * fix(tauri-cli): remove busy-looping --- crates/tauri-cli/src/interface/mod.rs | 1 - crates/tauri-cli/src/interface/rust.rs | 15 ++++----------- crates/tauri-cli/src/interface/rust/desktop.rs | 4 ---- crates/tauri-cli/src/mobile/mod.rs | 4 ---- 4 files changed, 4 insertions(+), 20 deletions(-) diff --git a/crates/tauri-cli/src/interface/mod.rs b/crates/tauri-cli/src/interface/mod.rs index f10bef0300ab..683d29ebaf34 100644 --- a/crates/tauri-cli/src/interface/mod.rs +++ b/crates/tauri-cli/src/interface/mod.rs @@ -16,7 +16,6 @@ pub use rust::{MobileOptions, Options, Rust as AppInterface, WatcherOptions}; pub trait DevProcess { fn kill(&self) -> std::io::Result<()>; - fn try_wait(&self) -> std::io::Result>; #[allow(unused)] fn wait(&self) -> std::io::Result; #[allow(unused)] diff --git a/crates/tauri-cli/src/interface/rust.rs b/crates/tauri-cli/src/interface/rust.rs index 2f0b635b19bd..c4c339e697d6 100644 --- a/crates/tauri-cli/src/interface/rust.rs +++ b/crates/tauri-cli/src/interface/rust.rs @@ -514,9 +514,7 @@ impl Rust { run: F, dirs: &Dirs, ) -> crate::Result<()> { - let child = run(self, config)?; - - let process = Arc::new(Mutex::new(child)); + let mut child = run(self, config)?; let (tx, rx) = sync_channel(1); let watch_folders = get_watch_folders(additional_watch_folders, dirs.tauri)?; @@ -581,17 +579,12 @@ impl Rust { display_path(event_path.strip_prefix(dirs.frontend).unwrap_or(event_path)) ); - let mut p = process.lock().unwrap(); - p.kill().context("failed to kill app process")?; + child.kill().context("failed to kill app process")?; // wait for the process to exit // note that on mobile, kill() already waits for the process to exit (duct implementation) - loop { - if !matches!(p.try_wait(), Ok(None)) { - break; - } - } - *p = run(self, config)?; + let _ = child.wait(); + child = run(self, config)?; } } } diff --git a/crates/tauri-cli/src/interface/rust/desktop.rs b/crates/tauri-cli/src/interface/rust/desktop.rs index adddfa60f859..ddde0a4f0a44 100644 --- a/crates/tauri-cli/src/interface/rust/desktop.rs +++ b/crates/tauri-cli/src/interface/rust/desktop.rs @@ -33,10 +33,6 @@ impl DevProcess for DevChild { Ok(()) } - fn try_wait(&self) -> std::io::Result> { - self.dev_child.try_wait() - } - fn wait(&self) -> std::io::Result { self.dev_child.wait() } diff --git a/crates/tauri-cli/src/mobile/mod.rs b/crates/tauri-cli/src/mobile/mod.rs index 248b16dbe68f..f7ab30357f62 100644 --- a/crates/tauri-cli/src/mobile/mod.rs +++ b/crates/tauri-cli/src/mobile/mod.rs @@ -72,10 +72,6 @@ impl DevProcess for DevChild { Ok(()) } - fn try_wait(&self) -> std::io::Result> { - self.child.try_wait().map(|res| res.map(|o| o.status)) - } - fn wait(&self) -> std::io::Result { self.child.wait().map(|o| o.status) }