From 4e101f801657e7d01ce8c22f9c6468067d0caab2 Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Sun, 4 Feb 2024 11:42:13 -0300 Subject: [PATCH] refactor(core): enhance app rerun-if-changed for capabilities and frontend dist (#8756) * refactor(core): enhance app rerun-if-changed for capabilities and frontend dist * always rerun-if-changed=capabilities * fix todo * rerun if plugin permissions change * add change files --- .changes/fix-codegen-rerun-if-changed.md | 5 ++++ .changes/refactor-capabilities-schema.md | 8 +++++++ .changes/rerun-if-permission-created.md | 6 +++++ .changes/update-plugin-template.md | 6 +++++ core/tauri-build/src/acl.rs | 2 +- core/tauri-build/src/codegen/context.rs | 5 +++- core/tauri-build/src/lib.rs | 5 ++++ core/tauri-plugin/src/build/mod.rs | 1 + core/tauri-utils/src/acl/build.rs | 24 ++++++------------- .../api/src-tauri/capabilities/run-app.json | 2 +- .../resources/src-tauri/capabilities/app.json | 2 +- .../cli/templates/app/src-tauri/.gitignore | 1 + .../app/src-tauri/capabilities/.gitignore | 1 - .../app/src-tauri/capabilities/default.json | 2 +- .../templates/plugin/permissions/.gitignore | 1 - 15 files changed, 47 insertions(+), 24 deletions(-) create mode 100644 .changes/fix-codegen-rerun-if-changed.md create mode 100644 .changes/refactor-capabilities-schema.md create mode 100644 .changes/rerun-if-permission-created.md create mode 100644 .changes/update-plugin-template.md delete mode 100644 tooling/cli/templates/app/src-tauri/capabilities/.gitignore delete mode 100644 tooling/cli/templates/plugin/permissions/.gitignore diff --git a/.changes/fix-codegen-rerun-if-changed.md b/.changes/fix-codegen-rerun-if-changed.md new file mode 100644 index 00000000000..1936787603f --- /dev/null +++ b/.changes/fix-codegen-rerun-if-changed.md @@ -0,0 +1,5 @@ +--- +"tauri-build": patch:bug +--- + +Do not trigger build script to rerun if the frontendDist directory does not exist. diff --git a/.changes/refactor-capabilities-schema.md b/.changes/refactor-capabilities-schema.md new file mode 100644 index 00000000000..ee1d56a3900 --- /dev/null +++ b/.changes/refactor-capabilities-schema.md @@ -0,0 +1,8 @@ +--- +"@tauri-apps/cli": patch:enhance +"tauri-cli": patch:enhance +"tauri-build": patch:enhance +"tauri-utils": patch:enhance +--- + +Moved the capability JSON schema to the `src-tauri/gen` folder so it's easier to track changes on the `capabilities` folder. diff --git a/.changes/rerun-if-permission-created.md b/.changes/rerun-if-permission-created.md new file mode 100644 index 00000000000..e0f9e83fe68 --- /dev/null +++ b/.changes/rerun-if-permission-created.md @@ -0,0 +1,6 @@ +--- +"tauri-plugin": patch:bug +"tauri-utils": patch:bug +--- + +Rerun build script when a new permission is added. diff --git a/.changes/update-plugin-template.md b/.changes/update-plugin-template.md new file mode 100644 index 00000000000..d6ca22f44b8 --- /dev/null +++ b/.changes/update-plugin-template.md @@ -0,0 +1,6 @@ +--- +"@tauri-apps/cli": patch:enhance +"tauri-cli": patch:enhance +--- + +Update app and plugin templates following generated files change from tauri-build and tauri-plugin. diff --git a/core/tauri-build/src/acl.rs b/core/tauri-build/src/acl.rs index a4617414dac..e995ced0f11 100644 --- a/core/tauri-build/src/acl.rs +++ b/core/tauri-build/src/acl.rs @@ -23,7 +23,7 @@ use tauri_utils::{ const CAPABILITIES_SCHEMA_FILE_NAME: &str = "schema.json"; /// Path of the folder where schemas are saved. -const CAPABILITIES_SCHEMA_FOLDER_PATH: &str = "capabilities/schemas"; +const CAPABILITIES_SCHEMA_FOLDER_PATH: &str = "gen/schemas"; const CAPABILITIES_FILE_NAME: &str = "capabilities.json"; const PLUGIN_MANIFESTS_FILE_NAME: &str = "plugin-manifests.json"; diff --git a/core/tauri-build/src/codegen/context.rs b/core/tauri-build/src/codegen/context.rs index 563d2753dce..65afc364a3c 100644 --- a/core/tauri-build/src/codegen/context.rs +++ b/core/tauri-build/src/codegen/context.rs @@ -84,7 +84,10 @@ impl CodegenContext { // rerun if changed match &config.build.frontend_dist { Some(FrontendDist::Directory(p)) => { - println!("cargo:rerun-if-changed={}", config_parent.join(p).display()); + let dist_path = config_parent.join(p); + if dist_path.exists() { + println!("cargo:rerun-if-changed={}", dist_path.display()); + } } Some(FrontendDist::Files(files)) => { for path in files { diff --git a/core/tauri-build/src/lib.rs b/core/tauri-build/src/lib.rs index 6ceaa98b6b5..7d892ecb4f2 100644 --- a/core/tauri-build/src/lib.rs +++ b/core/tauri-build/src/lib.rs @@ -355,6 +355,10 @@ impl Attributes { } /// Set the glob pattern to be used to find the capabilities. + /// + /// **Note:** You must emit [rerun-if-changed] instructions for your capabilities directory. + /// + /// [rerun-if-changed]: https://doc.rust-lang.org/cargo/reference/build-scripts.html#rerun-if-changed #[must_use] pub fn capabilities_path_pattern(mut self, pattern: &'static str) -> Self { self.capabilities_path_pattern.replace(pattern); @@ -477,6 +481,7 @@ pub fn try_build(attributes: Attributes) -> Result<()> { let capabilities = if let Some(pattern) = attributes.capabilities_path_pattern { parse_capabilities(pattern)? } else { + println!("cargo:rerun-if-changed=capabilities"); parse_capabilities("./capabilities/**/*")? }; acl::generate_schema(&plugin_manifests, target)?; diff --git a/core/tauri-plugin/src/build/mod.rs b/core/tauri-plugin/src/build/mod.rs index 14a6b513bcc..60f99da0d9e 100644 --- a/core/tauri-plugin/src/build/mod.rs +++ b/core/tauri-plugin/src/build/mod.rs @@ -98,6 +98,7 @@ impl<'a> Builder<'a> { acl::build::autogenerate_command_permissions(&commands_dir, self.commands, ""); } + println!("cargo:rerun-if-changed=permissions"); let permissions = acl::build::define_permissions("./permissions/**/*.*", &name, &out_dir)?; acl::build::generate_schema(&permissions, "./permissions")?; diff --git a/core/tauri-utils/src/acl/build.rs b/core/tauri-utils/src/acl/build.rs index fbacab52728..9c3d4f16bb4 100644 --- a/core/tauri-utils/src/acl/build.rs +++ b/core/tauri-utils/src/acl/build.rs @@ -7,8 +7,7 @@ use std::{ collections::{BTreeMap, HashMap}, env::{current_dir, vars_os}, - fs::{create_dir_all, read_to_string, write, File}, - io::{BufWriter, Write}, + fs::{create_dir_all, read_to_string, write}, path::{Path, PathBuf}, }; @@ -80,15 +79,6 @@ pub fn define_permissions( .filter(|p| p.parent().unwrap().file_name().unwrap() != PERMISSION_SCHEMAS_FOLDER_NAME) .collect::>(); - for path in &permission_files { - if !path - .components() - .any(|c| c.as_os_str() == AUTOGENERATED_FOLDER_NAME) - { - println!("cargo:rerun-if-changed={}", path.display()); - } - } - let permission_files_path = out_dir.join(format!("{}-permission-files", pkg_name)); std::fs::write( &permission_files_path, @@ -147,10 +137,9 @@ pub fn parse_capabilities( .unwrap_or_default() }) // filter schema files + // TODO: remove this before stable .filter(|p| p.parent().unwrap().file_name().unwrap() != CAPABILITIES_SCHEMA_FOLDER_NAME) { - println!("cargo:rerun-if-changed={}", path.display()); - let capability_file = std::fs::read_to_string(&path).map_err(Error::ReadFile)?; let ext = path.extension().unwrap().to_string_lossy().to_string(); let capability: CapabilityFile = match ext.as_str() { @@ -252,10 +241,11 @@ pub fn generate_schema>( let out_dir = out_dir.as_ref().join(PERMISSION_SCHEMAS_FOLDER_NAME); create_dir_all(&out_dir).expect("unable to create schema output directory"); - let mut schema_file = BufWriter::new( - File::create(out_dir.join(PERMISSION_SCHEMA_FILE_NAME)).map_err(Error::CreateFile)?, - ); - write!(schema_file, "{schema_str}").map_err(Error::WriteFile)?; + let schema_path = out_dir.join(PERMISSION_SCHEMA_FILE_NAME); + if schema_str != read_to_string(&schema_path).unwrap_or_default() { + write(schema_path, schema_str).map_err(Error::WriteFile)?; + } + Ok(()) } diff --git a/examples/api/src-tauri/capabilities/run-app.json b/examples/api/src-tauri/capabilities/run-app.json index 130dad08811..a95e15871c9 100644 --- a/examples/api/src-tauri/capabilities/run-app.json +++ b/examples/api/src-tauri/capabilities/run-app.json @@ -1,5 +1,5 @@ { - "$schema": "./schemas/desktop-schema.json", + "$schema": "../gen/schemas/desktop-schema.json", "identifier": "run-app", "description": "permissions to run the app", "windows": ["main", "main-*"], diff --git a/examples/resources/src-tauri/capabilities/app.json b/examples/resources/src-tauri/capabilities/app.json index cc8663cf0b1..caa288fab66 100644 --- a/examples/resources/src-tauri/capabilities/app.json +++ b/examples/resources/src-tauri/capabilities/app.json @@ -1,5 +1,5 @@ { - "$schema": "./schemas/desktop-schema.json", + "$schema": "../gen/schemas/desktop-schema.json", "identifier": "app", "permissions": ["event:default", "window:default"], "windows": ["main"] diff --git a/tooling/cli/templates/app/src-tauri/.gitignore b/tooling/cli/templates/app/src-tauri/.gitignore index aba21e242c9..502406b4eda 100755 --- a/tooling/cli/templates/app/src-tauri/.gitignore +++ b/tooling/cli/templates/app/src-tauri/.gitignore @@ -1,3 +1,4 @@ # Generated by Cargo # will have compiled files and executables /target/ +/gen/schemas diff --git a/tooling/cli/templates/app/src-tauri/capabilities/.gitignore b/tooling/cli/templates/app/src-tauri/capabilities/.gitignore deleted file mode 100644 index c75f615b12f..00000000000 --- a/tooling/cli/templates/app/src-tauri/capabilities/.gitignore +++ /dev/null @@ -1 +0,0 @@ -schemas/ diff --git a/tooling/cli/templates/app/src-tauri/capabilities/default.json b/tooling/cli/templates/app/src-tauri/capabilities/default.json index 24375715149..fbce0f6df8c 100644 --- a/tooling/cli/templates/app/src-tauri/capabilities/default.json +++ b/tooling/cli/templates/app/src-tauri/capabilities/default.json @@ -1,5 +1,5 @@ { - "$schema": "./schemas/desktop-schema.json", + "$schema": "../gen/schemas/desktop-schema.json", "identifier": "default-plugins", "description": "enables the default permissions", "windows": ["main"], diff --git a/tooling/cli/templates/plugin/permissions/.gitignore b/tooling/cli/templates/plugin/permissions/.gitignore deleted file mode 100644 index c75f615b12f..00000000000 --- a/tooling/cli/templates/plugin/permissions/.gitignore +++ /dev/null @@ -1 +0,0 @@ -schemas/