You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(())
}

错误分析与修复点

  1. 值被移动/Arc无expect/unwrap方法

    • 原代码中Watchexec::new返回Result<Arc<Watchexec>, CriticalError>,但通过?已经将其解包为Arc<Watchexec>,后续调用wx.expect()和wx.unwrap()属于错误操作——Arc类型根本没有这些方法,同时解包操作会导致值所有权被移动,无法二次使用。
    • 修复:直接使用解包后的Arc<Watchexec>实例,删除多余的expect和unwrap调用。
  2. CriticalError未实现Diagnostic trait

    • miette的Result要求错误类型必须实现Diagnostic trait,但watchexec的CriticalError默认不满足该约束,直接用?解包会触发trait不匹配错误。
    • 修复:调用into_diagnostic()方法将CriticalError转换为miette兼容的错误类型,替代直接?解包。
  3. 配置顺序错误

    • 原代码先启动引擎(调用mainf())再设置监听路径,会导致路径配置不生效——引擎启动后修改配置不会被应用到运行实例中。
    • 修复:先执行wx.config.pathset()配置监听路径,再调用mainf()启动引擎。
  4. 未使用的导入警告

    • 原代码中IntoDiagnostic导入被警告未使用,是因为没有用它转换错误。修复后该导入会被into_diagnostic()方法用到,警告自动消失。

编译验证

执行cargo build --all-features即可正常编译,运行程序后会监听当前目录的文件变化,收到退出信号时自动终止。

内容的提问来源于stack exchange,提问作者Maxime Roche

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:27:35