Skip to content

Commit e3fdcb5

Browse files
sftseLegend-Master
andauthored
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>
1 parent d453e2e commit e3fdcb5

File tree

11 files changed

+106
-131
lines changed

11 files changed

+106
-131
lines changed

.changes/change-pr-14836.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@tauri-apps/cli": patch:changes
3+
"tauri-cli": patch:changes
4+
---
5+
6+
Continued refactors of tauri-cli, fix too weak atomics.

crates/tauri-cli/src/dev.rs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ use std::{
2525
process::{exit, Command, Stdio},
2626
sync::{
2727
atomic::{AtomicBool, Ordering},
28-
Arc, Mutex, OnceLock,
28+
OnceLock,
2929
},
3030
};
3131

3232
mod builtin_dev_server;
3333

34-
static BEFORE_DEV: OnceLock<Mutex<Arc<SharedChild>>> = OnceLock::new();
34+
static BEFORE_DEV: OnceLock<SharedChild> = OnceLock::new();
3535
static KILL_BEFORE_DEV_FLAG: AtomicBool = AtomicBool::new(false);
3636

3737
#[cfg(unix)]
@@ -205,21 +205,18 @@ pub fn setup(
205205

206206
let child = SharedChild::spawn(&mut command)
207207
.unwrap_or_else(|_| panic!("failed to run `{before_dev}`"));
208-
let child = Arc::new(child);
209-
let child_ = child.clone();
210208

209+
let child = BEFORE_DEV.get_or_init(move || child);
211210
std::thread::spawn(move || {
212-
let status = child_
211+
let status = child
213212
.wait()
214213
.expect("failed to wait on \"beforeDevCommand\"");
215-
if !(status.success() || KILL_BEFORE_DEV_FLAG.load(Ordering::Relaxed)) {
214+
if !(status.success() || KILL_BEFORE_DEV_FLAG.load(Ordering::SeqCst)) {
216215
log::error!("The \"beforeDevCommand\" terminated with a non-zero status code.");
217216
exit(status.code().unwrap_or(1));
218217
}
219218
});
220219

221-
BEFORE_DEV.set(Mutex::new(child)).unwrap();
222-
223220
let _ = ctrlc::set_handler(move || {
224221
kill_before_dev_process();
225222
exit(130);
@@ -336,11 +333,10 @@ pub fn on_app_exit(code: Option<i32>, reason: ExitReason, exit_on_panic: bool, n
336333

337334
pub fn kill_before_dev_process() {
338335
if let Some(child) = BEFORE_DEV.get() {
339-
let child = child.lock().unwrap();
340-
if KILL_BEFORE_DEV_FLAG.load(Ordering::Relaxed) {
336+
if KILL_BEFORE_DEV_FLAG.load(Ordering::SeqCst) {
341337
return;
342338
}
343-
KILL_BEFORE_DEV_FLAG.store(true, Ordering::Relaxed);
339+
KILL_BEFORE_DEV_FLAG.store(true, Ordering::SeqCst);
344340
#[cfg(windows)]
345341
{
346342
let powershell_path = std::env::var("SYSTEMROOT").map_or_else(

crates/tauri-cli/src/interface/rust.rs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ impl Rust {
210210

211211
if options.no_watch {
212212
let (tx, rx) = sync_channel(1);
213-
self.run_dev(options, run_args, move |status, reason| {
213+
self.run_dev(options, &run_args, move |status, reason| {
214214
on_exit(status, reason);
215215
tx.send(()).unwrap();
216216
})?;
@@ -225,9 +225,11 @@ impl Rust {
225225
&merge_configs,
226226
|rust: &mut Rust, _config| {
227227
let on_exit = on_exit.clone();
228-
rust.run_dev(options.clone(), run_args.clone(), move |status, reason| {
229-
on_exit(status, reason)
230-
})
228+
rust
229+
.run_dev(options.clone(), &run_args, move |status, reason| {
230+
on_exit(status, reason)
231+
})
232+
.map(|child| Box::new(child) as Box<dyn DevProcess + Send>)
231233
},
232234
dirs,
233235
)
@@ -361,7 +363,7 @@ fn build_ignore_matcher(dir: &Path) -> IgnoreMatcher {
361363

362364
ignore_builder.add(path);
363365

364-
if let Ok(ignore_file) = std::env::var("TAURI_CLI_WATCHER_IGNORE_FILENAME") {
366+
if let Some(ignore_file) = std::env::var_os("TAURI_CLI_WATCHER_IGNORE_FILENAME") {
365367
ignore_builder.add(dir.join(ignore_file));
366368
}
367369

@@ -393,7 +395,7 @@ fn lookup<F: FnMut(FileType, PathBuf)>(dir: &Path, mut f: F) {
393395
let mut builder = ignore::WalkBuilder::new(dir);
394396
builder.add_custom_ignore_filename(".taurignore");
395397
let _ = builder.add_ignore(default_gitignore);
396-
if let Ok(ignore_file) = std::env::var("TAURI_CLI_WATCHER_IGNORE_FILENAME") {
398+
if let Some(ignore_file) = std::env::var_os("TAURI_CLI_WATCHER_IGNORE_FILENAME") {
397399
builder.add_ignore(ignore_file);
398400
}
399401
builder.require_git(false).ignore(false).max_depth(Some(1));
@@ -490,17 +492,16 @@ impl Rust {
490492
fn run_dev<F: Fn(Option<i32>, ExitReason) + Send + Sync + 'static>(
491493
&mut self,
492494
options: Options,
493-
run_args: Vec<String>,
495+
run_args: &[String],
494496
on_exit: F,
495-
) -> crate::Result<Box<dyn DevProcess + Send>> {
497+
) -> crate::Result<desktop::DevChild> {
496498
desktop::run_dev(
497499
options,
498500
run_args,
499501
&mut self.available_targets,
500502
self.config_features.clone(),
501503
on_exit,
502504
)
503-
.map(|c| Box::new(c) as Box<dyn DevProcess + Send>)
504505
}
505506

506507
fn run_dev_watcher<
@@ -1380,7 +1381,7 @@ fn tauri_config_to_bundle_settings(
13801381
if enabled_features.contains(&"tray-icon".into())
13811382
|| enabled_features.contains(&"tauri/tray-icon".into())
13821383
{
1383-
let (tray_kind, path) = std::env::var("TAURI_LINUX_AYATANA_APPINDICATOR")
1384+
let (tray_kind, path) = std::env::var_os("TAURI_LINUX_AYATANA_APPINDICATOR")
13841385
.map(|ayatana| {
13851386
if ayatana == "true" || ayatana == "1" {
13861387
(
@@ -1402,7 +1403,7 @@ fn tauri_config_to_bundle_settings(
14021403
)
14031404
}
14041405
})
1405-
.unwrap_or_else(|_| pkgconfig_utils::get_appindicator_library_path());
1406+
.unwrap_or_else(pkgconfig_utils::get_appindicator_library_path);
14061407
match tray_kind {
14071408
pkgconfig_utils::TrayKind::Ayatana => {
14081409
depends_deb.push("libayatana-appindicator3-1".into());

crates/tauri-cli/src/interface/rust/desktop.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ pub struct DevChild {
2929
impl DevProcess for DevChild {
3030
fn kill(&self) -> std::io::Result<()> {
3131
self.dev_child.kill()?;
32-
self.manually_killed_app.store(true, Ordering::Relaxed);
32+
self.manually_killed_app.store(true, Ordering::SeqCst);
3333
Ok(())
3434
}
3535

@@ -42,17 +42,17 @@ impl DevProcess for DevChild {
4242
}
4343

4444
fn manually_killed_process(&self) -> bool {
45-
self.manually_killed_app.load(Ordering::Relaxed)
45+
self.manually_killed_app.load(Ordering::SeqCst)
4646
}
4747
}
4848

4949
pub fn run_dev<F: Fn(Option<i32>, ExitReason) + Send + Sync + 'static>(
5050
options: Options,
51-
run_args: Vec<String>,
51+
run_args: &[String],
5252
available_targets: &mut Option<Vec<RustupTarget>>,
5353
config_features: Vec<String>,
5454
on_exit: F,
55-
) -> crate::Result<impl DevProcess> {
55+
) -> crate::Result<DevChild> {
5656
let mut dev_cmd = cargo_command(true, options, available_targets, config_features)?;
5757
let runner = dev_cmd.get_program().to_string_lossy().into_owned();
5858

@@ -137,7 +137,7 @@ pub fn run_dev<F: Fn(Option<i32>, ExitReason) + Send + Sync + 'static>(
137137
status.code(),
138138
if status.code() == Some(101) && is_cargo_compile_error {
139139
ExitReason::CompilationFailed
140-
} else if manually_killed_app_.load(Ordering::Relaxed) {
140+
} else if manually_killed_app_.load(Ordering::SeqCst) {
141141
ExitReason::TriggeredKill
142142
} else {
143143
ExitReason::NormalExit
@@ -163,7 +163,7 @@ pub fn build(
163163
let out_dir = app_settings.out_dir(&options, tauri_dir)?;
164164
let bin_path = app_settings.app_binary_path(&options, tauri_dir)?;
165165

166-
if !std::env::var("STATIC_VCRUNTIME").is_ok_and(|v| v == "false") {
166+
if !std::env::var_os("STATIC_VCRUNTIME").is_some_and(|v| v == "false") {
167167
std::env::set_var("STATIC_VCRUNTIME", "true");
168168
}
169169

crates/tauri-cli/src/mobile/android/android_studio_script.rs

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -62,20 +62,17 @@ pub fn command(options: Options) -> Result<()> {
6262
)?
6363
};
6464

65-
let (config, metadata) = {
66-
let (config, metadata) = get_config(
67-
&get_app(
68-
MobileTarget::Android,
69-
&tauri_config,
70-
&AppInterface::new(&tauri_config, None, dirs.tauri)?,
71-
dirs.tauri,
72-
),
65+
let (config, metadata) = get_config(
66+
&get_app(
67+
MobileTarget::Android,
7368
&tauri_config,
74-
&[],
75-
&cli_options,
76-
);
77-
(config, metadata)
78-
};
69+
&AppInterface::new(&tauri_config, None, dirs.tauri)?,
70+
dirs.tauri,
71+
),
72+
&tauri_config,
73+
&[],
74+
&cli_options,
75+
);
7976

8077
ensure_init(
8178
&tauri_config,

crates/tauri-cli/src/mobile/android/build.rs

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -153,19 +153,16 @@ pub fn run(
153153
.unwrap();
154154
build_options.target = Some(first_target.triple.into());
155155

156-
let (interface, config, metadata) = {
157-
let interface = AppInterface::new(tauri_config, build_options.target.clone(), dirs.tauri)?;
158-
interface.build_options(&mut Vec::new(), &mut build_options.features, true);
159-
160-
let app = get_app(MobileTarget::Android, tauri_config, &interface, dirs.tauri);
161-
let (config, metadata) = get_config(
162-
&app,
163-
tauri_config,
164-
&build_options.features,
165-
&Default::default(),
166-
);
167-
(interface, config, metadata)
168-
};
156+
let interface = AppInterface::new(tauri_config, build_options.target.clone(), dirs.tauri)?;
157+
interface.build_options(&mut Vec::new(), &mut build_options.features, true);
158+
159+
let app = get_app(MobileTarget::Android, tauri_config, &interface, dirs.tauri);
160+
let (config, metadata) = get_config(
161+
&app,
162+
tauri_config,
163+
&build_options.features,
164+
&Default::default(),
165+
);
169166

170167
let profile = if options.debug {
171168
Profile::Debug

crates/tauri-cli/src/mobile/android/dev.rs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -183,18 +183,15 @@ fn run_command(options: Options, noise_level: NoiseLevel, dirs: Dirs) -> Result<
183183
.unwrap_or_else(|| Target::all().values().next().unwrap().triple.into());
184184
dev_options.target = Some(target_triple);
185185

186-
let (interface, config, metadata) = {
187-
let interface = AppInterface::new(&tauri_config, dev_options.target.clone(), dirs.tauri)?;
186+
let interface = AppInterface::new(&tauri_config, dev_options.target.clone(), dirs.tauri)?;
188187

189-
let app = get_app(MobileTarget::Android, &tauri_config, &interface, dirs.tauri);
190-
let (config, metadata) = get_config(
191-
&app,
192-
&tauri_config,
193-
dev_options.features.as_ref(),
194-
&Default::default(),
195-
);
196-
(interface, config, metadata)
197-
};
188+
let app = get_app(MobileTarget::Android, &tauri_config, &interface, dirs.tauri);
189+
let (config, metadata) = get_config(
190+
&app,
191+
&tauri_config,
192+
dev_options.features.as_ref(),
193+
&Default::default(),
194+
);
198195

199196
set_current_dir(dirs.tauri).context("failed to set current directory to Tauri directory")?;
200197

crates/tauri-cli/src/mobile/ios/build.rs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -194,20 +194,17 @@ pub fn run(options: Options, noise_level: NoiseLevel, dirs: &Dirs) -> Result<Bui
194194
&options.config.iter().map(|c| &c.0).collect::<Vec<_>>(),
195195
dirs.tauri,
196196
)?;
197-
let (interface, mut config) = {
198-
let interface = AppInterface::new(&tauri_config, build_options.target.clone(), dirs.tauri)?;
199-
interface.build_options(&mut Vec::new(), &mut build_options.features, true);
200-
201-
let app = get_app(MobileTarget::Ios, &tauri_config, &interface, dirs.tauri);
202-
let (config, _metadata) = get_config(
203-
&app,
204-
&tauri_config,
205-
&build_options.features,
206-
&Default::default(),
207-
dirs.tauri,
208-
)?;
209-
(interface, config)
210-
};
197+
let interface = AppInterface::new(&tauri_config, build_options.target.clone(), dirs.tauri)?;
198+
interface.build_options(&mut Vec::new(), &mut build_options.features, true);
199+
200+
let app = get_app(MobileTarget::Ios, &tauri_config, &interface, dirs.tauri);
201+
let (mut config, _) = get_config(
202+
&app,
203+
&tauri_config,
204+
&build_options.features,
205+
&Default::default(),
206+
dirs.tauri,
207+
)?;
211208

212209
set_current_dir(dirs.tauri).context("failed to set current directory")?;
213210

crates/tauri-cli/src/mobile/ios/dev.rs

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -188,20 +188,16 @@ fn run_command(options: Options, noise_level: NoiseLevel, dirs: Dirs) -> Result<
188188
&options.config.iter().map(|c| &c.0).collect::<Vec<_>>(),
189189
dirs.tauri,
190190
)?;
191-
let (interface, config) = {
192-
let interface = AppInterface::new(&tauri_config, Some(target_triple), dirs.tauri)?;
191+
let interface = AppInterface::new(&tauri_config, Some(target_triple), dirs.tauri)?;
193192

194-
let app = get_app(MobileTarget::Ios, &tauri_config, &interface, dirs.tauri);
195-
let (config, _metadata) = get_config(
196-
&app,
197-
&tauri_config,
198-
&dev_options.features,
199-
&Default::default(),
200-
dirs.tauri,
201-
)?;
202-
203-
(interface, config)
204-
};
193+
let app = get_app(MobileTarget::Ios, &tauri_config, &interface, dirs.tauri);
194+
let (config, _) = get_config(
195+
&app,
196+
&tauri_config,
197+
&dev_options.features,
198+
&Default::default(),
199+
dirs.tauri,
200+
)?;
205201

206202
set_current_dir(dirs.tauri).context("failed to set current directory to Tauri directory")?;
207203

0 commit comments

Comments
 (0)