Skip to content

Commit 1ed2600

Browse files
fix(cli): set current dir to tauri dir before reading config, closes #6771 (#6782)
Co-authored-by: Lucas Nogueira <lucas@tauri.app> Co-authored-by: Lucas Nogueira <lucas@tauri.studio> fix(cli): set current dir to tauri dir before reading config, closes #6771
1 parent 735db1c commit 1ed2600

File tree

18 files changed

+464
-396
lines changed

18 files changed

+464
-396
lines changed

.changes/cli-mobile-cwd-config.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'cli.rs': 'patch'
3+
'cli.js': 'patch'
4+
---
5+
6+
Set current directory to tauri directory before reading config file.

tooling/cli/src/build.rs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::{
77
app_paths::{app_dir, tauri_dir},
88
command_env,
99
config::{get as get_config, AppUrl, HookCommand, WindowUrl, MERGE_CONFIG_EXTENSION_NAME},
10+
resolve_merge_config,
1011
updater_signature::{read_key_from_file, secret_key as updater_secret_key, sign_file},
1112
},
1213
interface::{AppInterface, AppSettings, Interface},
@@ -233,22 +234,14 @@ pub fn command(mut options: Options, verbosity: u8) -> Result<()> {
233234
}
234235

235236
pub fn setup(options: &mut Options, mobile: bool) -> Result<AppInterface> {
236-
let (merge_config, merge_config_path) = match &options.config {
237-
Some(config) if config.starts_with('{') => (Some(config.to_string()), None),
238-
Some(config) => (
239-
Some(std::fs::read_to_string(config).with_context(|| "failed to read custom configuration")?),
240-
Some(config.clone()),
241-
),
242-
None => (None, None),
243-
};
244-
237+
let (merge_config, merge_config_path) = resolve_merge_config(&options.config)?;
245238
options.config = merge_config;
246239

240+
let config = get_config(options.config.as_deref())?;
241+
247242
let tauri_path = tauri_dir();
248243
set_current_dir(tauri_path).with_context(|| "failed to change current working directory")?;
249244

250-
let config = get_config(options.config.as_deref())?;
251-
252245
let config_guard = config.lock().unwrap();
253246
let config_ = config_guard.as_ref().unwrap();
254247

tooling/cli/src/dev.rs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::{
77
app_paths::{app_dir, tauri_dir},
88
command_env,
99
config::{get as get_config, reload as reload_config, AppUrl, BeforeDevCommand, WindowUrl},
10+
resolve_merge_config,
1011
},
1112
interface::{AppInterface, DevProcess, ExitReason, Interface},
1213
CommandExt, Result,
@@ -137,21 +138,14 @@ pub fn local_ip_address(force: bool) -> &'static IpAddr {
137138
}
138139

139140
pub fn setup(options: &mut Options, mobile: bool) -> Result<AppInterface> {
140-
let tauri_path = tauri_dir();
141-
options.config = if let Some(config) = &options.config {
142-
Some(if config.starts_with('{') {
143-
config.to_string()
144-
} else {
145-
std::fs::read_to_string(config).with_context(|| "failed to read custom configuration")?
146-
})
147-
} else {
148-
None
149-
};
150-
151-
set_current_dir(tauri_path).with_context(|| "failed to change current working directory")?;
141+
let (merge_config, _merge_config_path) = resolve_merge_config(&options.config)?;
142+
options.config = merge_config;
152143

153144
let config = get_config(options.config.as_deref())?;
154145

146+
let tauri_path = tauri_dir();
147+
set_current_dir(tauri_path).with_context(|| "failed to change current working directory")?;
148+
155149
let interface = AppInterface::new(
156150
config.lock().unwrap().as_ref().unwrap(),
157151
options.target.clone(),

tooling/cli/src/helpers/config.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ pub use tauri_utils::config::*;
1212

1313
use std::{
1414
collections::HashMap,
15-
env::{set_var, var_os},
15+
env::{current_dir, set_current_dir, set_var, var_os},
1616
ffi::OsStr,
1717
process::exit,
1818
sync::{Arc, Mutex},
@@ -165,7 +165,13 @@ fn get_internal(merge_config: Option<&str>, reload: bool) -> crate::Result<Confi
165165
}
166166
}
167167

168+
// the `Config` deserializer for `package > version` can resolve the version from a path relative to the config path
169+
// so we actually need to change the current working directory here
170+
let current_dir = current_dir()?;
171+
set_current_dir(config_path.parent().unwrap())?;
168172
let config: Config = serde_json::from_value(config)?;
173+
// revert to previous working directory
174+
set_current_dir(current_dir)?;
169175

170176
*config_handle().lock().unwrap() = Some(ConfigMetadata {
171177
inner: config,

tooling/cli/src/helpers/mod.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ pub mod template;
1111
pub mod updater_signature;
1212
pub mod web_dev_server;
1313

14+
use anyhow::Context;
15+
1416
use std::{
1517
collections::HashMap,
1618
path::{Path, PathBuf},
@@ -52,3 +54,16 @@ pub fn cross_command(bin: &str) -> Command {
5254
let cmd = Command::new(bin);
5355
cmd
5456
}
57+
58+
pub fn resolve_merge_config(
59+
config: &Option<String>,
60+
) -> crate::Result<(Option<String>, Option<String>)> {
61+
match config {
62+
Some(config) if config.starts_with('{') => Ok((Some(config.to_string()), None)),
63+
Some(config) => Ok((
64+
Some(std::fs::read_to_string(config).with_context(|| "failed to read custom configuration")?),
65+
Some(config.clone()),
66+
)),
67+
None => Ok((None, None)),
68+
}
69+
}

tooling/cli/src/icon.rs

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
// SPDX-License-Identifier: Apache-2.0
33
// SPDX-License-Identifier: MIT
44

5-
use crate::{helpers::app_paths::tauri_dir, Result};
5+
use crate::{
6+
helpers::{app_paths::tauri_dir, config::get as get_tauri_config},
7+
Result,
8+
};
69

710
use std::{
811
collections::HashMap,
@@ -356,24 +359,31 @@ fn png(source: &DynamicImage, out_dir: &Path, ios_color: Rgba<u8>) -> Result<()>
356359
}
357360

358361
let mut entries = desktop_entries(out_dir);
359-
let _ = crate::mobile::android::with_config(
360-
Some(Default::default()),
361-
|_app, config, _metadata, _cli_options| {
362-
let android_out = out_dir.parent().unwrap().join(format!(
363-
"gen/android/{}/app/src/main/res/",
364-
config.app().name_snake()
365-
));
366-
let out = if android_out.exists() {
367-
android_out
368-
} else {
369-
let out = out_dir.join("android");
370-
create_dir_all(&out).context("Can't create Android output directory")?;
371-
out
372-
};
373-
entries.extend(android_entries(&out)?);
374-
Ok(())
375-
},
376-
);
362+
363+
// Android
364+
let (config, _metadata) = {
365+
let tauri_config = get_tauri_config(None)?;
366+
367+
let tauri_config_guard = tauri_config.lock().unwrap();
368+
let tauri_config_ = tauri_config_guard.as_ref().unwrap();
369+
crate::mobile::android::get_config(
370+
&crate::mobile::get_app(tauri_config_),
371+
tauri_config_,
372+
&Default::default(),
373+
)
374+
};
375+
let android_out = out_dir.parent().unwrap().join(format!(
376+
"gen/android/{}/app/src/main/res/",
377+
config.app().name_snake()
378+
));
379+
let out = if android_out.exists() {
380+
android_out
381+
} else {
382+
let out = out_dir.join("android");
383+
create_dir_all(&out).context("Can't create Android output directory")?;
384+
out
385+
};
386+
entries.extend(android_entries(&out)?);
377387

378388
let ios_out = out_dir
379389
.parent()

tooling/cli/src/mobile/android.rs

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,7 @@ use super::{
3232
log_finished, read_options, setup_dev_config, CliOptions, Target as MobileTarget,
3333
MIN_DEVICE_MATCH_SCORE,
3434
};
35-
use crate::{
36-
helpers::config::{get as get_tauri_config, Config as TauriConfig},
37-
Result,
38-
};
35+
use crate::{helpers::config::Config as TauriConfig, Result};
3936

4037
mod android_studio_script;
4138
mod build;
@@ -97,11 +94,10 @@ pub fn command(cli: Cli, verbosity: u8) -> Result<()> {
9794
}
9895

9996
pub fn get_config(
100-
app: Option<App>,
97+
app: &App,
10198
config: &TauriConfig,
10299
cli_options: &CliOptions,
103-
) -> (App, AndroidConfig, AndroidMetadata) {
104-
let app = app.unwrap_or_else(|| get_app(config));
100+
) -> (AndroidConfig, AndroidMetadata) {
105101
let android_options = cli_options.clone();
106102

107103
let raw = RawAndroidConfig {
@@ -158,23 +154,7 @@ pub fn get_config(
158154
src_main_dir.join("generated"),
159155
);
160156

161-
(app, config, metadata)
162-
}
163-
164-
pub fn with_config<T>(
165-
cli_options: Option<CliOptions>,
166-
f: impl FnOnce(&App, &AndroidConfig, &AndroidMetadata, CliOptions) -> Result<T>,
167-
) -> Result<T> {
168-
let (app, config, metadata, cli_options) = {
169-
let tauri_config = get_tauri_config(None)?;
170-
let tauri_config_guard = tauri_config.lock().unwrap();
171-
let tauri_config_ = tauri_config_guard.as_ref().unwrap();
172-
let cli_options =
173-
cli_options.unwrap_or_else(|| read_options(&tauri_config_.tauri.bundle.identifier));
174-
let (app, config, metadata) = get_config(None, tauri_config_, &cli_options);
175-
(app, config, metadata, cli_options)
176-
};
177-
f(&app, &config, &metadata, cli_options)
157+
(config, metadata)
178158
}
179159

180160
fn env() -> Result<Env> {

tooling/cli/src/mobile/android/android_studio_script.rs

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
// SPDX-License-Identifier: Apache-2.0
33
// SPDX-License-Identifier: MIT
44

5-
use super::{detect_target_ok, ensure_init, env, with_config, MobileTarget};
6-
use crate::Result;
5+
use super::{detect_target_ok, ensure_init, env, get_app, get_config, read_options, MobileTarget};
6+
use crate::{helpers::config::get as get_tauri_config, Result};
77
use clap::{ArgAction, Parser};
88

99
use tauri_mobile::{
@@ -36,28 +36,35 @@ pub fn command(options: Options) -> Result<()> {
3636
Profile::Debug
3737
};
3838

39-
with_config(None, |_app, config, metadata, cli_options| {
40-
ensure_init(config.project_dir(), MobileTarget::Android)?;
41-
42-
let env = env()?;
43-
44-
call_for_targets_with_fallback(
45-
options.targets.unwrap_or_default().iter(),
46-
&detect_target_ok,
47-
&env,
48-
|target: &Target| {
49-
target
50-
.build(
51-
config,
52-
metadata,
53-
&env,
54-
cli_options.noise_level,
55-
true,
56-
profile,
57-
)
58-
.map_err(Into::into)
59-
},
60-
)
61-
.map_err(|e| anyhow::anyhow!(e.to_string()))?
62-
})
39+
let tauri_config = get_tauri_config(None)?;
40+
41+
let (config, metadata, cli_options) = {
42+
let tauri_config_guard = tauri_config.lock().unwrap();
43+
let tauri_config_ = tauri_config_guard.as_ref().unwrap();
44+
let cli_options = read_options(&tauri_config_.tauri.bundle.identifier);
45+
let (config, metadata) = get_config(&get_app(tauri_config_), tauri_config_, &cli_options);
46+
(config, metadata, cli_options)
47+
};
48+
ensure_init(config.project_dir(), MobileTarget::Android)?;
49+
50+
let env = env()?;
51+
52+
call_for_targets_with_fallback(
53+
options.targets.unwrap_or_default().iter(),
54+
&detect_target_ok,
55+
&env,
56+
|target: &Target| {
57+
target
58+
.build(
59+
&config,
60+
&metadata,
61+
&env,
62+
cli_options.noise_level,
63+
true,
64+
profile,
65+
)
66+
.map_err(Into::into)
67+
},
68+
)
69+
.map_err(|e| anyhow::anyhow!(e.to_string()))?
6370
}

0 commit comments

Comments
 (0)