Skip to content

Commit 1af9be9

Browse files
authored
feat(cli): properly fill target for TAURI_ env vars on mobile (#6116)
1 parent 78eaada commit 1af9be9

File tree

10 files changed

+133
-77
lines changed

10 files changed

+133
-77
lines changed

.changes/fix-mobile-env-vars.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+
Fixes `TAURI_*` environment variables for hook scripts on mobile commands.

examples/api/vite.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { internalIpV4 } from 'internal-ip'
55

66
// https://vitejs.dev/config/
77
export default defineConfig(async ({ command, mode }) => {
8-
const host = await internalIpV4()
8+
const host = process.env.TAURI_PLATFORM === 'android' || process.env.TAURI_PLATFORM === 'ios' ? (await internalIpV4()) : 'localhost'
99
return {
1010
plugins: [Unocss(), svelte()],
1111
build: {

tooling/cli/src/dev.rs

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ fn command_internal(mut options: Options) -> Result<()> {
8686
})
8787
}
8888

89-
fn local_ip_address() -> &'static IpAddr {
89+
pub fn local_ip_address() -> &'static IpAddr {
9090
static LOCAL_IP: OnceCell<IpAddr> = OnceCell::new();
9191
LOCAL_IP.get_or_init(|| {
9292
let addresses: Vec<IpAddr> = local_ip_address::list_afinet_netifas()
@@ -148,30 +148,6 @@ pub fn setup(options: &mut Options, mobile: bool) -> Result<AppInterface> {
148148
.dev_path
149149
.clone();
150150

151-
if mobile {
152-
if let AppUrl::Url(WindowUrl::External(url)) = &mut dev_path {
153-
let localhost = match url.host() {
154-
Some(url::Host::Domain(d)) => d == "localhost",
155-
Some(url::Host::Ipv4(i)) => {
156-
i == std::net::Ipv4Addr::LOCALHOST || i == std::net::Ipv4Addr::UNSPECIFIED
157-
}
158-
_ => false,
159-
};
160-
if localhost {
161-
let ip = local_ip_address();
162-
url.set_host(Some(&ip.to_string())).unwrap();
163-
if let Some(c) = &options.config {
164-
let mut c: tauri_utils::config::Config = serde_json::from_str(c)?;
165-
c.build.dev_path = dev_path.clone();
166-
options.config = Some(serde_json::to_string(&c).unwrap());
167-
} else {
168-
options.config = Some(format!(r#"{{ "build": {{ "devPath": "{}" }} }}"#, url))
169-
}
170-
reload_config(options.config.as_deref())?;
171-
}
172-
}
173-
}
174-
175151
if let Some(before_dev) = config
176152
.lock()
177153
.unwrap()

tooling/cli/src/mobile/android.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ use tauri_mobile::{
2727
use super::{
2828
ensure_init, get_app,
2929
init::{command as init_command, init_dot_cargo},
30-
log_finished, read_options, CliOptions, Target as MobileTarget, MIN_DEVICE_MATCH_SCORE,
30+
log_finished, read_options, setup_dev_config, CliOptions, Target as MobileTarget,
31+
MIN_DEVICE_MATCH_SCORE,
3132
};
3233
use crate::{
3334
helpers::config::{get as get_tauri_config, Config as TauriConfig},

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use super::{
33
MobileTarget,
44
};
55
use crate::{
6+
build::Options as BuildOptions,
67
helpers::flock,
78
interface::{AppSettings, Interface, Options as InterfaceOptions},
89
mobile::{write_options, CliOptions},
@@ -53,7 +54,7 @@ pub struct Options {
5354
pub open: bool,
5455
}
5556

56-
impl From<Options> for crate::build::Options {
57+
impl From<Options> for BuildOptions {
5758
fn from(options: Options) -> Self {
5859
Self {
5960
runner: None,
@@ -111,7 +112,14 @@ fn run_build(
111112
options.aab = true;
112113
}
113114

114-
let mut build_options = options.clone().into();
115+
let mut build_options: BuildOptions = options.clone().into();
116+
build_options.target = Some(
117+
Target::all()
118+
.get(Target::DEFAULT_KEY)
119+
.unwrap()
120+
.triple
121+
.into(),
122+
);
115123
let interface = crate::build::setup(&mut build_options, true)?;
116124

117125
let app_settings = interface.app_settings();

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

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
use super::{
2-
delete_codegen_vars, device_prompt, ensure_init, env, init_dot_cargo, open_and_wait, with_config,
3-
MobileTarget,
2+
delete_codegen_vars, device_prompt, ensure_init, env, init_dot_cargo, open_and_wait,
3+
setup_dev_config, with_config, MobileTarget,
44
};
55
use crate::{
6+
dev::Options as DevOptions,
67
helpers::flock,
78
interface::{AppSettings, Interface, MobileOptions, Options as InterfaceOptions},
89
mobile::{write_options, CliOptions, DevChild, DevProcess},
@@ -13,6 +14,7 @@ use clap::{ArgAction, Parser};
1314
use tauri_mobile::{
1415
android::{
1516
config::{Config as AndroidConfig, Metadata as AndroidMetadata},
17+
device::Device,
1618
env::Env,
1719
},
1820
config::app::App,
@@ -55,7 +57,7 @@ pub struct Options {
5557
pub device: Option<String>,
5658
}
5759

58-
impl From<Options> for crate::dev::Options {
60+
impl From<Options> for DevOptions {
5961
fn from(options: Options) -> Self {
6062
Self {
6163
runner: None,
@@ -89,13 +91,29 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> {
8991
}
9092

9193
fn run_dev(
92-
options: Options,
94+
mut options: Options,
9395
app: &App,
9496
config: &AndroidConfig,
9597
metadata: &AndroidMetadata,
9698
noise_level: NoiseLevel,
9799
) -> Result<()> {
98-
let mut dev_options = options.clone().into();
100+
setup_dev_config(&mut options.config)?;
101+
let env = env()?;
102+
let device = match device_prompt(&env, options.device.as_deref()) {
103+
Ok(d) => Some(d),
104+
Err(e) => {
105+
log::error!("{e}");
106+
None
107+
}
108+
};
109+
110+
let mut dev_options: DevOptions = options.clone().into();
111+
dev_options.target = Some(
112+
device
113+
.as_ref()
114+
.map(|d| d.target().triple.to_string())
115+
.unwrap_or_else(|| "aarch64-linux-android".into()),
116+
);
99117
let mut interface = crate::dev::setup(&mut dev_options, true)?;
100118

101119
let app_settings = interface.app_settings();
@@ -106,13 +124,11 @@ fn run_dev(
106124
let out_dir = bin_path.parent().unwrap();
107125
let _lock = flock::open_rw(out_dir.join("lock").with_extension("android"), "Android")?;
108126

109-
let env = env()?;
110127
init_dot_cargo(app, Some((&env, config)))?;
111128

112129
let open = options.open;
113130
let exit_on_panic = options.exit_on_panic;
114131
let no_watch = options.no_watch;
115-
let device = options.device;
116132
interface.mobile_dev(
117133
MobileOptions {
118134
debug: true,
@@ -133,45 +149,34 @@ fn run_dev(
133149

134150
if open {
135151
open_and_wait(config, &env)
136-
} else {
137-
match run(
138-
device.as_deref(),
139-
options,
140-
config,
141-
&env,
142-
metadata,
143-
noise_level,
144-
) {
152+
} else if let Some(device) = &device {
153+
match run(device, options, config, &env, metadata, noise_level) {
145154
Ok(c) => {
146155
crate::dev::wait_dev_process(c.clone(), move |status, reason| {
147156
crate::dev::on_app_exit(status, reason, exit_on_panic, no_watch)
148157
});
149158
Ok(Box::new(c) as Box<dyn DevProcess>)
150159
}
151-
Err(RunError::FailedToPromptForDevice(e)) => {
152-
log::error!("{}", e);
153-
open_and_wait(config, &env)
154-
}
155160
Err(e) => {
156161
crate::dev::kill_before_dev_process();
157162
Err(e.into())
158163
}
159164
}
165+
} else {
166+
open_and_wait(config, &env)
160167
}
161168
},
162169
)
163170
}
164171

165172
#[derive(Debug, thiserror::Error)]
166173
enum RunError {
167-
#[error("{0}")]
168-
FailedToPromptForDevice(String),
169174
#[error("{0}")]
170175
RunFailed(String),
171176
}
172177

173178
fn run(
174-
device: Option<&str>,
179+
device: &Device<'_>,
175180
options: MobileOptions,
176181
config: &AndroidConfig,
177182
env: &Env,
@@ -186,8 +191,7 @@ fn run(
186191

187192
let build_app_bundle = metadata.asset_packs().is_some();
188193

189-
device_prompt(env, device)
190-
.map_err(|e| RunError::FailedToPromptForDevice(e.to_string()))?
194+
device
191195
.run(
192196
config,
193197
env,

tooling/cli/src/mobile/ios.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ use tauri_mobile::{
2525
use super::{
2626
ensure_init, env, get_app,
2727
init::{command as init_command, init_dot_cargo},
28-
log_finished, read_options, CliOptions, Target as MobileTarget, MIN_DEVICE_MATCH_SCORE,
28+
log_finished, read_options, setup_dev_config, CliOptions, Target as MobileTarget,
29+
MIN_DEVICE_MATCH_SCORE,
2930
};
3031
use crate::{
3132
helpers::config::{get as get_tauri_config, Config as TauriConfig},

tooling/cli/src/mobile/ios/build.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use super::{
33
MobileTarget,
44
};
55
use crate::{
6+
build::Options as BuildOptions,
67
helpers::flock,
78
interface::{AppSettings, Interface, Options as InterfaceOptions},
89
mobile::{write_options, CliOptions},
@@ -49,7 +50,7 @@ pub struct Options {
4950
pub open: bool,
5051
}
5152

52-
impl From<Options> for crate::build::Options {
53+
impl From<Options> for BuildOptions {
5354
fn from(options: Options) -> Self {
5455
Self {
5556
runner: None,
@@ -97,7 +98,14 @@ fn run_build(
9798
Profile::Release
9899
};
99100

100-
let mut build_options = options.clone().into();
101+
let mut build_options: BuildOptions = options.clone().into();
102+
build_options.target = Some(
103+
Target::all()
104+
.get(Target::DEFAULT_KEY)
105+
.unwrap()
106+
.triple
107+
.into(),
108+
);
101109
let interface = crate::build::setup(&mut build_options, true)?;
102110

103111
let app_settings = interface.app_settings();

0 commit comments

Comments
 (0)