fix(build): stop infinite tauri dev rebuild loop on auto-updater.json
The build script unconditionally rewrote capabilities/auto-updater.json on every run, which bumped the file's mtime. tauri-build emits cargo:rerun-if-changed=capabilities so any touch in that directory re-runs this script, and 'tauri dev' also watches that folder for source reloads. The two watchers fed each other: compile → rewrite (same bytes, fresh mtime) → cargo marks build.rs dirty → recompile → tauri dev sees mtime change → request another build → repeat. Now we read the existing file first and only write when the content actually differs. mtime stays stable when the generated text is identical across runs, so neither cargo nor tauri dev observe a change and the loop terminates. cc
This commit is contained in:
1 file changed
+14
-2
+14
-2
@@ -20,8 +20,20 @@ fn main() {
|
||||
let capability_path = Path::new("capabilities/auto-updater.json");
|
||||
|
||||
if cfg!(feature = "updater") {
|
||||
if let Err(e) = fs::write(capability_path, AUTO_UPDATER_CAPABILITY) {
|
||||
panic!("Failed to emit auto-updater capability: {e}");
|
||||
// IMPORTANT: only write if contents actually changed. tauri-build emits
|
||||
// `cargo:rerun-if-changed=capabilities` which makes cargo re-run this
|
||||
// build script whenever anything in that directory is touched. If we
|
||||
// unconditionally `fs::write` we update the file's mtime every run,
|
||||
// which re-triggers the build script AND makes `tauri dev`'s file
|
||||
// watcher rebuild the app in an infinite loop.
|
||||
let needs_write = match fs::read_to_string(capability_path) {
|
||||
Ok(existing) => existing != AUTO_UPDATER_CAPABILITY,
|
||||
Err(_) => true,
|
||||
};
|
||||
if needs_write {
|
||||
if let Err(e) = fs::write(capability_path, AUTO_UPDATER_CAPABILITY) {
|
||||
panic!("Failed to emit auto-updater capability: {e}");
|
||||
}
|
||||
}
|
||||
} else if capability_path.exists() {
|
||||
if let Err(e) = fs::remove_file(capability_path) {
|
||||
|
||||
Reference in new issue
Block a user