Просмотр исходного кода

fix(cli): keep dev watcher alive if config is incorrect, closes #5173 (#5495)

Co-authored-by: Lucas Nogueira <lucas@tauri.studio>
Amr Bashir 2 лет назад
Родитель
Сommit
cc186c7a0e

+ 5 - 0
.changes/cli-dev-alive-on-error.md

@@ -0,0 +1,5 @@
+---
+"cli.rs": "patch"
+---
+
+Keep `tauri dev` watcher alive when the configuration is invalid.

+ 6 - 3
tooling/cli/src/helpers/config.rs

@@ -4,6 +4,7 @@
 
 use anyhow::Context;
 use json_patch::merge;
+use log::error;
 use once_cell::sync::Lazy;
 use serde_json::Value as JsonValue;
 
@@ -141,12 +142,14 @@ fn get_internal(merge_config: Option<&str>, reload: bool) -> crate::Result<Confi
       for error in errors {
         let path = error.instance_path.clone().into_vec().join(" > ");
         if path.is_empty() {
-          eprintln!("`{config_file_name}` error: {}", error);
+          error!("`{}` error: {}", config_file_name, error);
         } else {
-          eprintln!("`{config_file_name}` error on `{}`: {}", path, error);
+          error!("`{}` error on `{}`: {}", config_file_name, path, error);
         }
       }
-      exit(1);
+      if !reload {
+        exit(1);
+      }
     }
   }
 

+ 16 - 5
tooling/cli/src/interface/rust.rs

@@ -22,7 +22,7 @@ use anyhow::Context;
 #[cfg(target_os = "linux")]
 use heck::ToKebabCase;
 use ignore::gitignore::{Gitignore, GitignoreBuilder};
-use log::{debug, info};
+use log::{debug, error, info};
 use notify::RecursiveMode;
 use notify_debouncer_mini::new_debouncer;
 use serde::Deserialize;
@@ -457,10 +457,21 @@ impl Rust {
 
           if !ignore_matcher.is_ignore(&event_path, event_path.is_dir()) {
             if is_configuration_file(&event_path) {
-              info!("Tauri configuration changed. Rewriting manifest...");
-              let config = reload_config(options.config.as_deref())?;
-              self.app_settings.manifest =
-                rewrite_manifest(config.lock().unwrap().as_ref().unwrap())?;
+              match reload_config(options.config.as_deref()) {
+                Ok(config) => {
+                  info!("Tauri configuration changed. Rewriting manifest...");
+                  self.app_settings.manifest =
+                    rewrite_manifest(config.lock().unwrap().as_ref().unwrap())?
+                }
+                Err(err) => {
+                  let p = process.lock().unwrap();
+                  let is_building_app = p.app_child.lock().unwrap().is_none();
+                  if is_building_app {
+                    p.kill().with_context(|| "failed to kill app process")?;
+                  }
+                  error!("{}", err);
+                }
+              }
             } else {
               info!(
                 "File {} changed. Rebuilding application...",