From 2969d1cbba39301f9cc611d9f7d7051d80eef846 Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Sun, 23 Apr 2023 07:21:36 -0700 Subject: [PATCH] refactor(core): use absolute path to plugin Android project (#6773) --- .changes/plugin-android-project-refactor.md | 6 +++++ core/tauri-build/src/lib.rs | 25 ++++++++++++--------- core/tauri-build/src/mobile.rs | 25 +++++++++++++++------ tooling/cli/src/mobile/mod.rs | 2 +- 4 files changed, 39 insertions(+), 19 deletions(-) create mode 100644 .changes/plugin-android-project-refactor.md diff --git a/.changes/plugin-android-project-refactor.md b/.changes/plugin-android-project-refactor.md new file mode 100644 index 00000000000..84965802d29 --- /dev/null +++ b/.changes/plugin-android-project-refactor.md @@ -0,0 +1,6 @@ +--- +"cli.rs": patch +"tauri-build": patch +--- + +Use absolute path to each Android plugin project instead of copying the files to enhance developer experience. diff --git a/core/tauri-build/src/lib.rs b/core/tauri-build/src/lib.rs index 2417eff2f67..40a1e0fe92f 100644 --- a/core/tauri-build/src/lib.rs +++ b/core/tauri-build/src/lib.rs @@ -15,8 +15,9 @@ use tauri_utils::{ }; use std::{ + collections::HashMap, env::var_os, - fs::{read_dir, write}, + fs::{read_to_string, write}, path::{Path, PathBuf}, }; @@ -298,22 +299,24 @@ val implementation by configurations dependencies {" .to_string(); - for entry in read_dir(project_dir.join(".tauri").join("plugins"))? { - let pkg_name = entry? - .path() - .file_name() - .unwrap() - .to_string_lossy() - .into_owned(); - gradle_settings.push_str(&format!("include ':{pkg_name}'")); + let plugins_json_path = project_dir.join(".tauri").join("plugins.json"); + let plugins: HashMap = if plugins_json_path.exists() { + let s = read_to_string(&plugins_json_path)?; + serde_json::from_str(&s)? + } else { + Default::default() + }; + for (plugin_name, plugin) in plugins { + gradle_settings.push_str(&format!("include ':{plugin_name}'")); gradle_settings.push('\n'); gradle_settings.push_str(&format!( - "project(':{pkg_name}').projectDir = new File('./.tauri/plugins/{pkg_name}')" + "project(':{plugin_name}').projectDir = new File('{}')", + plugin.path.display() )); gradle_settings.push('\n'); app_build_gradle.push('\n'); - app_build_gradle.push_str(&format!(r#" implementation(project(":{pkg_name}"))"#)); + app_build_gradle.push_str(&format!(r#" implementation(project(":{plugin_name}"))"#)); } app_build_gradle.push_str("\n}"); diff --git a/core/tauri-build/src/mobile.rs b/core/tauri-build/src/mobile.rs index 86a7b84799d..b34c0ffcaf4 100644 --- a/core/tauri-build/src/mobile.rs +++ b/core/tauri-build/src/mobile.rs @@ -3,12 +3,19 @@ // SPDX-License-Identifier: MIT use std::{ + collections::HashMap, env::{var, var_os}, - fs::{copy, create_dir, create_dir_all, remove_dir_all, rename}, + fs::{copy, create_dir, create_dir_all, read_to_string, remove_dir_all, rename, write}, path::{Path, PathBuf}, }; use anyhow::{Context, Result}; +use serde::{Deserialize, Serialize}; + +#[derive(Deserialize, Serialize)] +pub(crate) struct PluginMetadata { + pub path: PathBuf, +} #[derive(Default)] pub struct PluginBuilder { @@ -49,6 +56,7 @@ impl PluginBuilder { let tauri_library_path = std::env::var("DEP_TAURI_ANDROID_LIBRARY_PATH") .expect("missing `DEP_TAURI_ANDROID_LIBRARY_PATH` environment variable. Make sure `tauri` is a dependency of the plugin."); + println!("cargo:rerun-if-env-changed=DEP_TAURI_ANDROID_LIBRARY_PATH"); create_dir_all(source.join(".tauri")).context("failed to create .tauri directory")?; copy_folder( @@ -62,12 +70,15 @@ impl PluginBuilder { let pkg_name = var("CARGO_PKG_NAME").unwrap(); println!("cargo:rerun-if-env-changed=TAURI_ANDROID_PROJECT_PATH"); - inject_android_project( - &source, - project_dir.join(".tauri").join("plugins").join(pkg_name), - &["tauri-api"], - ) - .context("failed to inject plugin Android project")?; + let plugins_json_path = project_dir.join(".tauri").join("plugins.json"); + let mut plugins: HashMap = if plugins_json_path.exists() { + let s = read_to_string(&plugins_json_path)?; + serde_json::from_str(&s)? + } else { + Default::default() + }; + plugins.insert(pkg_name, PluginMetadata { path: source }); + write(&plugins_json_path, serde_json::to_string(&plugins)?)?; } } } diff --git a/tooling/cli/src/mobile/mod.rs b/tooling/cli/src/mobile/mod.rs index 2ea3e084657..4b0708b36f0 100644 --- a/tooling/cli/src/mobile/mod.rs +++ b/tooling/cli/src/mobile/mod.rs @@ -316,7 +316,7 @@ fn ensure_init(project_dir: PathBuf, target: Target) -> Result<()> { ) } else { if target == Target::Android { - create_dir_all(project_dir.join(".tauri").join("plugins"))?; + create_dir_all(project_dir.join(".tauri"))?; } Ok(()) }