Rust watchexec crate示例编译错误求助
修复Watchexec示例中的Rust编译错误
修复后的完整代码
use miette::{IntoDiagnostic, Result}; use watchexec::Watchexec; #[tokio::main] async fn main() -> Result<()> { // 初始化Watchexec并转换错误为miette兼容类型 let wx = Watchexec::new(|mut action| { for event in action.events.iter() { eprintln!("{event:?}"); } if action.signals().next().is_some() { eprintln!("[Quitting...]"); action.quit(); } action }) .into_diagnostic()?; // 先配置监听路径 wx.config.pathset([ "." ]); // 启动watchexec引擎 let main = wx.mainf(); let _ = main.await.into_diagnostic()?; Ok(()) }
错误分析与修复点
值被移动/Arc无expect/unwrap方法
- 原代码中
Watchexec::new返回Result<Arc<Watchexec>, CriticalError>,但通过?已经将其解包为Arc<Watchexec>,后续调用wx.expect()和wx.unwrap()属于错误操作——Arc类型根本没有这些方法,同时解包操作会导致值所有权被移动,无法二次使用。 - 修复:直接使用解包后的
Arc<Watchexec>实例,删除多余的expect和unwrap调用。
- 原代码中
CriticalError未实现Diagnostic trait
- miette的
Result要求错误类型必须实现Diagnostictrait,但watchexec的CriticalError默认不满足该约束,直接用?解包会触发trait不匹配错误。 - 修复:调用
into_diagnostic()方法将CriticalError转换为miette兼容的错误类型,替代直接?解包。
- miette的
配置顺序错误
- 原代码先启动引擎(调用
mainf())再设置监听路径,会导致路径配置不生效——引擎启动后修改配置不会被应用到运行实例中。 - 修复:先执行
wx.config.pathset()配置监听路径,再调用mainf()启动引擎。
- 原代码先启动引擎(调用
未使用的导入警告
- 原代码中
IntoDiagnostic导入被警告未使用,是因为没有用它转换错误。修复后该导入会被into_diagnostic()方法用到,警告自动消失。
- 原代码中
编译验证
执行cargo build --all-features即可正常编译,运行程序后会监听当前目录的文件变化,收到退出信号时自动终止。
内容的提问来源于stack exchange,提问作者Maxime Roche
相关产品推荐
相关产品推荐

