Fix: on embedded hotreload don't watch target directory
This commit is contained in:
1 file changed
+49
-7
@@ -109,14 +109,19 @@ impl<Ctx: HotReloadingContext> Config<Ctx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Initialize the hot reloading listener
|
/// Initialize the hot reloading listener
|
||||||
|
///
|
||||||
|
/// This is designed to be called by hot_reload_Init!() which will pass in information about the project
|
||||||
|
///
|
||||||
|
/// Notes:
|
||||||
|
/// - We don't wannt to watch the
|
||||||
pub fn init<Ctx: HotReloadingContext + Send + 'static>(cfg: Config<Ctx>) {
|
pub fn init<Ctx: HotReloadingContext + Send + 'static>(cfg: Config<Ctx>) {
|
||||||
let Config {
|
let Config {
|
||||||
|
mut rebuild_with,
|
||||||
root_path,
|
root_path,
|
||||||
listening_paths,
|
listening_paths,
|
||||||
log,
|
log,
|
||||||
mut rebuild_with,
|
|
||||||
excluded_paths,
|
excluded_paths,
|
||||||
phantom: _,
|
..
|
||||||
} = cfg;
|
} = cfg;
|
||||||
|
|
||||||
let Ok(crate_dir) = PathBuf::from_str(root_path) else {
|
let Ok(crate_dir) = PathBuf::from_str(root_path) else {
|
||||||
@@ -146,11 +151,13 @@ pub fn init<Ctx: HotReloadingContext + Send + 'static>(cfg: Config<Ctx>) {
|
|||||||
.is_ignore()
|
.is_ignore()
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
for err in errors {
|
for err in errors {
|
||||||
if log {
|
if log {
|
||||||
println!("hot reloading failed to initialize:\n{err:?}");
|
println!("hot reloading failed to initialize:\n{err:?}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let file_map = Arc::new(Mutex::new(file_map));
|
let file_map = Arc::new(Mutex::new(file_map));
|
||||||
|
|
||||||
let target_dir = crate_dir.join("target");
|
let target_dir = crate_dir.join("target");
|
||||||
@@ -221,8 +228,42 @@ pub fn init<Ctx: HotReloadingContext + Send + 'static>(cfg: Config<Ctx>) {
|
|||||||
|
|
||||||
let mut watcher = RecommendedWatcher::new(tx, notify::Config::default()).unwrap();
|
let mut watcher = RecommendedWatcher::new(tx, notify::Config::default()).unwrap();
|
||||||
|
|
||||||
for path in listening_paths {
|
let mut listening_pathbufs = vec![];
|
||||||
let full_path = crate_dir.join(path);
|
|
||||||
|
// We're attempting to watch the root path... which contains a target directory...
|
||||||
|
// And on some platforms the target directory is really really large and can cause the watcher to crash
|
||||||
|
// since it runs out of file handles
|
||||||
|
// So we're going to iterate through its children and watch them instead of the root path, skipping the target
|
||||||
|
// directory.
|
||||||
|
//
|
||||||
|
// In reality, this whole approach of doing embedded file watching is kinda hairy since you want full knowledge
|
||||||
|
// of where rust code is. We could just use the filemap we generated above as an indication of where the rust
|
||||||
|
// code is in this project and deduce the subfolders under the root path from that.
|
||||||
|
//
|
||||||
|
// FIXME: use a more robust system here for embedded discovery
|
||||||
|
//
|
||||||
|
// https://github.com/DioxusLabs/dioxus/issues/1914
|
||||||
|
if listening_paths == &[""] {
|
||||||
|
for entry in std::fs::read_dir(&crate_dir)
|
||||||
|
.expect("failed to read rust crate directory. Are you running with cargo?")
|
||||||
|
{
|
||||||
|
let entry = entry.expect("failed to read directory entry");
|
||||||
|
let path = entry.path();
|
||||||
|
if path.is_dir() {
|
||||||
|
if path == target_dir {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
listening_pathbufs.push(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for path in listening_paths {
|
||||||
|
let full_path = crate_dir.join(path);
|
||||||
|
listening_pathbufs.push(full_path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for full_path in listening_pathbufs {
|
||||||
if let Err(err) = watcher.watch(&full_path, RecursiveMode::Recursive) {
|
if let Err(err) = watcher.watch(&full_path, RecursiveMode::Recursive) {
|
||||||
if log {
|
if log {
|
||||||
println!("hot reloading failed to start watching {full_path:?}:\n{err:?}",);
|
println!("hot reloading failed to start watching {full_path:?}:\n{err:?}",);
|
||||||
@@ -295,11 +336,12 @@ pub fn init<Ctx: HotReloadingContext + Send + 'static>(cfg: Config<Ctx>) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// find changes to the rsx in the file
|
// find changes to the rsx in the file
|
||||||
match file_map
|
let changes = file_map
|
||||||
.lock()
|
.lock()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.update_rsx(path, crate_dir.as_path())
|
.update_rsx(path, crate_dir.as_path());
|
||||||
{
|
|
||||||
|
match changes {
|
||||||
Ok(UpdateResult::UpdatedRsx(msgs)) => {
|
Ok(UpdateResult::UpdatedRsx(msgs)) => {
|
||||||
for msg in msgs {
|
for msg in msgs {
|
||||||
let mut i = 0;
|
let mut i = 0;
|
||||||
|
|||||||
Reference in new issue
Block a user