改了代码还要手动重跑命令?这个 Rust 工具帮你盯着文件变化

正文顶部截图

写代码的日常:改几行,Alt+Tab 切终端,按上箭头,回车,等结果。再改几行,Alt+Tab 切终端,按上箭头,回车……

一天下来,这个循环重复几十上百次,思路被切得稀碎。

有没有办法让机器自己盯着文件变化,变化了就自动跑命令?

watchexec 干的正是这件事。一个用 Rust 写的命令行工具,专门监控文件变动,自动触发你指定的命令。目前在 GitHub 上拿到近 7000 个 Star。

README区域截图

怎么用

两条命令就能说清楚。

前端项目,监控 JS、CSS、HTML 文件变化,自动执行构建:

watchexec -e js,css,html npm run build

Python 项目,改了 .py 文件自动重启服务:

watchexec -r -e py -- python server.py

-e 指定监控的文件扩展名,-r 表示先杀掉旧进程再启动新的,-- 后面是你想执行的命令和参数。

它还会把触发变更的文件路径写入环境变量和 STDIN,你可以在被执行的命令里拿到具体哪些文件变了,做更精细的处理。

几个实用的设计

事件合并。 很多编辑器保存文件时会先写临时文件再重命名,这个过程产生多个文件系统事件。watchexec 会把短时间内的连续事件合并成一次触发,避免命令被重复执行好几遍。比如你用 vim 保存一个文件,底层可能触发 3 到 4 个事件,但 watchexec 只会执行一次命令。

自动读取 ignore 文件。 项目里的 .gitignore.ignore 会被自动加载,node_modulestarget__pycache__ 这类目录自动跳过,不用单独配置排除规则。

跨平台。 macOS、Linux、Windows 都可以跑,行为完全一致。你在 Mac 上配好的命令,放到 Linux 服务器上同样能用。

进程组管理。 你执行的命令如果 fork 了子进程,watchexec 能追踪整个进程组。重启时不会留下僵尸进程,这一点在跑开发服务器时很重要。

零依赖。 不绑定任何语言生态。不是 npm 包,不是 pip 包,一个独立的二进制文件,拷贝到任意机器上就能跑。

怎么装

安装渠道很多:

  • 各系统的包管理器基本都收录了:Homebrew、Scoop、Chocolatey、Arch、Debian、Nix
  • Cargo 从源码装:cargo install --locked watchexec-cli
  • 直接下载预编译的二进制文件

不止于监听文件

watchexec 周边有一些项目值得关注:

  • checkexec:只在源文件比目标文件新时才执行命令,适合增量构建场景
  • systemfd:开发环境中做 socket 转发,和 watchexec 搭配使用
  • cargo watch:Rust/Cargo 项目定制的 watcher
  • clearscreen:跨平台清屏工具

还有一些知名项目直接基于 watchexec 构建:cargo-lambda(AWS Lambda Rust 开发工具)、devenv.sh(Nix 开发环境管理)、ghciwatch(Haskell 项目 watcher)、dotter(dotfile 管理器)。这么多下游项目在使用它的库,说明核心的监听和执行机制经过了实际验证。

一句话总结

如果你每天在终端里反复敲同样的命令,可以试试 watchexec。一条命令配好,文件改了自动跑,不用手动切来切去。没有配置文件、不需要学习成本,下载即用。

反复敲同样的命令,可以试试 watchexec。一条命令配好,文件改了自动跑,不用手动切来切去。没有配置文件、不需要学习成本,下载即用。

更多推荐