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

100 lines
2.6 KiB
Rust
Raw Normal View History

// Copyright 2019-2024 Tauri Programme within The Commons Conservancy
2023-02-19 14:21:50 +00:00
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
use super::{detect_target_ok, ensure_init, env, get_app, get_config, read_options, MobileTarget};
use crate::{
helpers::config::get as get_tauri_config,
interface::{AppInterface, Interface},
Result,
};
use clap::{ArgAction, Parser};
use cargo_mobile2::{
android::{adb, target::Target},
opts::Profile,
target::{call_for_targets_with_fallback, TargetTrait},
};
#[derive(Debug, Parser)]
pub struct Options {
/// Targets to build.
#[clap(
short,
long = "target",
action = ArgAction::Append,
num_args(0..),
default_value = Target::DEFAULT_KEY,
value_parser(clap::builder::PossibleValuesParser::new(Target::name_list()))
)]
targets: Option<Vec<String>>,
/// Builds with the release flag
#[clap(short, long)]
release: bool,
}
pub fn command(options: Options) -> Result<()> {
let profile = if options.release {
Profile::Release
} else {
Profile::Debug
};
let tauri_config = get_tauri_config(tauri_utils::platform::Target::Android, None)?;
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 (config, metadata) = get_config(
&get_app(tauri_config_, &AppInterface::new(tauri_config_, None)?),
tauri_config_,
None,
&cli_options,
);
(config, metadata, cli_options)
};
ensure_init(config.project_dir(), MobileTarget::Android)?;
let env = env()?;
if cli_options.dev {
let dev_url = tauri_config
.lock()
.unwrap()
.as_ref()
.unwrap()
.build
.dev_url
.clone();
if let Some(port) = dev_url.and_then(|url| url.port_or_known_default()) {
let forward = format!("tcp:{port}");
// ignore errors in case we do not have a device available
let _ = adb::adb(&env, ["reverse", &forward, &forward])
.stdin_file(os_pipe::dup_stdin().unwrap())
.stdout_file(os_pipe::dup_stdout().unwrap())
.stderr_capture()
.run();
}
}
call_for_targets_with_fallback(
options.targets.unwrap_or_default().iter(),
&detect_target_ok,
&env,
|target: &Target| {
target
.build(
&config,
&metadata,
&env,
cli_options.noise_level,
true,
profile,
)
.map_err(Into::into)
},
)
.map_err(|e| anyhow::anyhow!(e.to_string()))?
}