我该如何让 Cargo 自动重新编译已更改的文件?

82

我听说cargo具有自动重新编译更改的源文件的能力,但我很难弄清楚如何告诉它这样做。

目前,每当我想要检查我的代码时,我都手动运行或。相比之下,我更希望只需保存文件即可在相邻的终端窗口中看到结果。

如果你仍然不知道我在说什么,我正在寻找cargo的等效命令sbt ~compilesbt ~run

这似乎异常困难,所以我开始怀疑是否真的支持。有人可能曾说过,cargo可以检测到已更改的文件并重新编译它们,但他实际上想表达的是cargo可以检测到未更改的文件并避免重新编译它们,就像make一样。

7个回答

130

cargo watch

如果您正在开发一个运行中的服务器项目(例如hyper,iron等),并且需要在文件更改时重新启动它,则可以使用cargo watch。安装:

cargo install cargo-watch

然后运行:

cargo watch -x run

要仅监视src文件夹中的更改并清除控制台,请使用:

cargo watch -c -w src -x run

请查看cargo-watch的README获取更多示例。

watchexec

或者,您可以使用watchexec。安装方法如下:

cargo install watchexec-cli

然后像这样使用它:

watchexec -r cargo run

2
感谢您使用watchexec!cargo-watch仅适用于cargo。 - stimulate
这似乎只适用于二进制文件,当我尝试使用库时,出现了“错误:必须为cargo run提供一个bin目标”的错误。 - Chris Stryczynski
1
watchexec 现在有一个单独的 CLI 包,因此实际安装命令是 cargo install watchexec-cli。此外,当前版本的正确调用方式不需要引号,因此是 watchexec --restart cargo run - Ilkka

4

看起来没有内置支持,但是有一个扩展 (cargo-watch) 可以使用 inotify来检测更改。

当我发现它时,它不能与稳定版(或当前版)的Rust一起使用,但我已经进行了修补。 它仍然需要一些工作,但它肯定可以加快编译/修复错误的周期。


4
我使用以下命令来运行nodemon:

nodemon

nodemon --watch src -e rs --exec cargo check

这个程序会监视src文件夹中的所有rs文件,并运行cargo check。


1
在运行上述命令之前,您需要使用npm全局安装nodemon。请执行以下命令:npm i -g nodemon - Llewellyn D'souza
你可以使用 npx nodemon --watch src -e rs --exec cargo check - Oliver Dixon

2
我认为区别在于运行cargo run两次不会重建代码,除非输入文件已更改。据我所知,Cargo没有您想要的功能内置。您可以提出功能请求。同时,我建议您只使用watch。您也可以使用类似于guard这样的东西。使用watch更简单,但只是每N秒运行一次您的代码。使用guard需要更多设置,但会更有效率。

2

另一个选择是使用entr

ls -r | entr cargo run

这将递归列出当前目录中的所有文件。然后将它们重定向到 entr 命令,该命令会监视这些文件的更改,并最终运行 cargo run


首先执行 brew install entr - jasonleonhard
我喜欢这个想法,但是应该是 ls -R 而不是 ls -r。遗憾的是,在我的系统上它无法工作。下面是一个能够工作的例子: $ find . -type f | entr echo 123 而这个却不能: $ find . -type f | entr cargo run 可能是因为 cargo run 命令不会立即退出。 - SergeiMinaev
终于我找到了如何让它工作的方法:find src | entr -r cargo run - SergeiMinaev
说了这么多,通常最好的选择仍然是使用 cargo - jasonleonhard

0

对我来说最稳定的选择是使用带有nodemon的npx

npx nodemon --watch src -e rs --exec cargo run

您需要安装nodejs和npm。


-6
在你的 Visual Studio Code 中:进入 文件 并勾选 自动保存,这将自动保存所做的更改。

这并不能实现自动化的目标。 - Shepmaster
不,它不会。保存文件不会导致Cargo构建它,这就是这个问题的重点。 - Shepmaster
这个回答荣获我过去几年中最离题奖。 - Michał Fita

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接