65 个稳定版本 (6 个主要版本)

8.5.2 2024年1月5日
8.4.1 2023年8月30日
8.4.0 2023年2月13日
8.2.1 2022年12月29日
2.1.2 2015年3月19日

#31 in Cargo 插件

Download history 6733/week @ 2024-04-23 7407/week @ 2024-04-30 6505/week @ 2024-05-07 6720/week @ 2024-05-14 6399/week @ 2024-05-21 6903/week @ 2024-05-28 8312/week @ 2024-06-04 10558/week @ 2024-06-11 9356/week @ 2024-06-18 7565/week @ 2024-06-25 6494/week @ 2024-07-02 6723/week @ 2024-07-09 6469/week @ 2024-07-16 7734/week @ 2024-07-23 7180/week @ 2024-07-30 7238/week @ 2024-08-06

29,958 每月下载次数
用于 7 crates

CC0 许可证

175KB
740

$ cargo watch

Crate release version Crate license: CC0 1.0 Crate download count CI status

Cargo Watch 会监视您项目的源代码变化,并在变化发生时运行 Cargo 命令。

如果您使用过 nodemonguardentr,这可能会让您感到熟悉。

  • 在公共领域 / 以 CC0 许可。
  • 最低支持的 Rust 版本:1.70.0。
    • 只支持最后五个稳定版本。
    • 发布时,该范围内的 MSRV 以外的增加不会导致主要版本号的增加。

安装

Packaging status

cargo-binstall 一起

$ cargo binstall cargo-watch

从源代码

$ cargo install cargo-watch

或者克隆并使用 $ cargo build 然后放置在您的 $PATH 中。

您还可以从 发布页面 上的预构建二进制文件中进行安装。

辅助

此存储库包含一个 手册页面Zsh 完成项,您可能希望安装。

用法

默认情况下,它运行 check。尽管您可以轻松地覆盖它

$ cargo watch [-x command]...

一些示例

# Run tests only
$ cargo watch -x test

# Run check then tests
$ cargo watch -x check -x test

# Run run with arguments
$ cargo watch -x 'run -- --some-arg'

# Run an arbitrary command
$ cargo watch -- echo Hello world

# Run with features passed to cargo
$ cargo watch --features "foo,bar"

您还可以做更多的事情!以下是帮助信息的副本

USAGE:
    cargo watch [FLAGS] [OPTIONS]

FLAGS:
    -c, --clear              Clear the screen before each run
    -h, --help               Display this message
        --ignore-nothing     Ignore nothing, not even target/ and .git/
        --debug              Show debug output
        --why                Show paths that changed
    -q, --quiet              Suppress output from cargo-watch itself
        --no-vcs-ignores       Don’t use .gitignore files
        --no-dot-ignores          Don’t use .ignore files
        --no-restart         Don’t restart command while it’s still running
    -N, --notify             Send a desktop notification when watchexec notices a change
                             (experimental, behaviour may change)
        --poll               Force use of polling for file changes
        --postpone           Postpone first run until a file changes
        --skip-local-deps    Don't try to find local dependencies of the current crate and watch
                             their working directories. Only watch the current directory.
    -V, --version            Display version information
        --watch-when-idle    Ignore events emitted while the commands run.

OPTIONS:
    -x, --exec <cmd>...            Cargo command(s) to execute on changes [default: check]
    -s, --shell <cmd>...           Shell command(s) to execute on changes
    -d, --delay <delay>            File updates debounce delay in seconds [default: 0.5]
        --features <features>      List of features passed to cargo invocations
    -i, --ignore <pattern>...      Ignore a glob/gitignore-style pattern
    -B <rust-backtrace>            Inject RUST_BACKTRACE=VALUE (generally you want to set it to 1)
                                   into the environment
        --use-shell <use-shell>    Use a different shell. E.g. --use-shell=bash
    -w, --watch <watch>...         Watch specific file(s) or folder(s). Disables finding and
                                   watching local dependencies.
    -C, --workdir <workdir>        Change working directory before running command [default: crate
                                   root]

ARGS:
    <cmd:trail>...    Full command to run. -x and -s will be ignored!

Cargo commands (-x) are always executed before shell commands (-s). You can use the `-- command`
style instead, note you'll need to use full commands, it won't prefix `cargo` for you.

By default, the workspace directories of your project and all local dependencies are watched,
except for the target/ and .git/ folders. Your .ignore and .gitignore files are used to filter
paths.

On Windows, patterns given to -i have forward slashes (/) automatically
converted to backward ones (\) to ease command portability.

忽略文件

.gitignore 文件默认用于忽略要监视和触发运行的路径。要停止尊重它们,请传递 --no-vcs-ignores

.ignore 文件在相同的语法中也被默认使用。该文件可用于指定应被 cargo watch 忽略但应提交到 git 的文件,而无需在命令行上不断添加 --ignore abc 选项。请注意,.ignore 文件也可能被其他程序使用,例如 ripgrep。要停止尊重这些,请传递 --no-dot-ignores

Cargo watch 还有一个内部默认忽略列表,这些列表在文件中指定的基础上,例如 target/.git/ 以及各种其他常见类型(日志、编辑器交换文件、锁文件等)。

要跳过所有忽略,请使用 --ignore-nothing 标志。

.git/info/exclude 和全局的 $HOME/.gitignore 以及类似的忽略文件 尚不支持

忽略语法

有关它们在此工具上下文中的工作方式,请参阅 Glob 模式页面。这是 --ignore 选项使用的语法。

此外,还有一些特定的怪癖和行为

  • 在 Windows 上,应使用 Windows 风格的(\\)分隔符指定模式。Unix 风格的分隔符(/)不会匹配 Windows 路径,这可能会造成混淆,并给人一种命令行忽略不起作用的印象。

  • 从 Cargo Watch 7.0.0 开始,在 Windows 上运行时,命令行忽略中的 / 会自动转换为 \\,但仍然应尝试为平台编写正确的模式,因为可能存在更微妙的不同。

  • 从 Cargo Watch 7.3.0 开始,--ignore 模式得到了修复,以提供更好的目录匹配体验。以前,忽略一个文件夹需要固执的 -/** 模式;现在这被内部处理,只需 - 就可以产生相同的效果。

无缝重新加载服务器

Cargo Watch 与 systemfd/Catflap 结合得很好,这些是在 Unix 平台上运行的工具,可以在监视器运行之前生成一个套接字,Rust 服务器可以将其绑定,从而避免请求丢失和臭名昭著的 ADDRINUSE 错误。例如

$ systemfd --no-pid -s http::5000 -- cargo watch -x run

当然,如果您不需要防范这些问题或不想修改程序以获取套接字而不是端口,您可以直接使用 Cargo Watch:它将愉快地正常重新启动您的服务器。

仅在构建/检查成功时重新启动应用程序

由 @LeDominik 提出,这是一个可能非常有用的模式:您正在开发一个服务器或应用程序,但希望在编写新功能或修复错误时保持其运行,这可能会在同时使代码无法编译。

在这种情况下,你可以使用以下策略:首先运行一个带有检查、构建、测试或任何你想要的 cargo watch,然后追加 -s 'touch .trigger(或你平台上的等效选项)。然后,同时运行第二个 cargo watch,这个命令仅监视 .trigger 文件。例如

$ cargo watch -x check -s 'touch .trigger'

$ cargo watch --no-vcs-ignores -w .trigger -x run

使用 --no-vcs-ignores 标志确保你可以安全地将 .trigger 添加到你的 .gitignore 文件中,以避免错误地提交它。

故障排除

在所有情况下,首先使用 cargo watch --version 检查你的版本,并在需要时升级到 最新版本

使用 cargo watch 时 RLS 很慢,反之亦然,或者它总是在等待项目锁定

Cargo 构建(包括检查、clippy 和测试,因为测试需要构建)会锁定项目,因此两个 cargo 实例不能同时运行。

然而,Rust Analyzer 在此方面做得更好,所以使用它代替 RLS。

在 Windows 7(或更低版本)上:"无法添加到作业对象:访问拒绝(OS 错误 5)"

Cargo Watch 版本 5.0.0 及以上(以及 Watchexec 版本 1.3.0 及以上)不支持 Windows 7 或更低版本 将不会添加支持。Windows <=7 的问题将被关闭。如果它工作,那真是太幸运了,但这不是故意为之。

我想直接运行 cargo-watch,而不通过 cargo

你可以!但你需要将 watch 子命令作为第一个参数指定,如下所示

$ /path/to/cargo-watch watch -x build

我想在 Cargo 项目外运行 cargo-watch

这不受支持。如果你有很好的理由在 Cargo 项目外使用特定于 Cargo 的工具,请提出问题!否则,你可能会更好地使用 Watchexec

如果文件更新似乎永远不会触发

尝试使用 --poll 强制轮询回退。

如果这仍然不起作用,并且你正在使用像 IntelliJ / PyCharm 这样的“安全保存”编辑器,你可能需要禁用“安全保存”,因为这可能会阻止文件通知被正确生成。

还可以尝试使用 --why 选项查看你是否期望的路径正在更改。

Linux:如果它无法监视某些深层目录但可以监视其他目录/“设备上没有空间”

你可能已达到 inotify 监视限制。 以下是对此含义及其如何增加的总结。

Docker:它没有正确响应信号或难以管理进程

Cargo Watch(以及其底层的 Watchexec)目前不支持作为 PID 1 运行。它可能适用于基本用途,但你应该考虑使用监视器、init 或 shell 来处理 PID 1 问题。在 Docker 中,--init 选项可能有用。

有关更多信息,请参阅 watchexec#140

Docker:通过挂载运行 cargo 命令非常缓慢

这实际上不是Cargo Watch的问题,但当您的宿主系统不是Linux时,由于文件系统间接引用,从容器内部在宿主机的卷或绑定挂载上运行命令将非常糟糕。如果可能的话,请考虑在挂载外构建

# ...
RUN mkdir -p /build
WORKDIR `/src`
ENTRYPOINT cargo watch -C /build --manifest-path=/src/Cargo.toml -- cargo run

或者类似地,与CARGO_TARGET_DIR

# ...
RUN mkdir -p /build
WORKDIR `/src`
ENV CARGO_TARGET_DIR=/build
ENTRYPOINT cargo watch -- cargo run

您可能还会遇到文件更新没有及时触发的问题,而不是编译需要很长时间。在这种情况下,您应该在Docker外部、在宿主机上运行Cargo Watch或Watchexec,并向容器发送重启或重新加载的信号。

如果您只想重新编译一个Cargo工作空间成员crate

目前尚未原生支持监视一个或多个特定工作空间成员,尽管您可以使用-w folder来近似实现。

通过在子命令上使用通常的-p选项来监视整个工作空间并在一个成员中运行命令

$ cargo watch -x 'build -p subcrate'

如果它反复运行而没有触及任何东西

当监视您正在运行的命令修改的文件时,可能会发生这种情况。

如果您只运行编译或检查(即仅影响目标/文件夹的任何命令)并且您正在使用-w,您可能正在混淆目标文件夹忽略器。检查您的选项和路径。

您还可以使用--watch-when-idle标志来忽略在命令运行时发生的任何事件。

如果它只触及被忽略的文件而反复运行

确保您忽略的文件是唯一被触及的文件。使用--why选项来查看哪些文件被修改并触发了重启。一些程序和库可能创建了不匹配简单忽略模式的临时文件。

如上所述,您也可以使用--watch-when-idle标志来帮助。

我的cargo输出/对于cargo测试没有颜色

这有时在某些终端配置或测试工具中发生。一个快速的解决方案(而不是陷入调试您的控制台设置的兔子洞)是将--color=always传递给命令。例如。

$ cargo watch -x 'check --color=always'

对于测试(和基准)命令,您需要将标志传递给底层程序而不是cargo

$ cargo watch -x 'test -- --color=always'

我想使用额外的功能编译我的构建

$ cargo watch --features foo,bar

将在每次监视到变化时运行cargo check --features foo,bar

--features将被传递给每个支持的cargo子命令。

$ cargo watch --features foo,bar -x build -x doc

将同时运行具有foobar功能的builddoc

以上未涉及的内容/我有功能请求

打开一个问题,或查看现有的问题。您还可以查看该工具依赖的Notify库的问题,或我们使用在底层的问题(我在那里也是维护者)

如果您希望有更多详细的输出,请尝试使用--debug标志运行。请注意,这将同时启用watchexec的调试模式。在提交问题之前,请确保包含启用--debug的日志,以便可以诊断问题。确保在启用调试模式的情况下提交日志,以便可以诊断问题。

如果您的問題是watchexec問題,請直接在那裡打開。如果您不確定,請隨意在此打開,但如果確實是watchexec問題,它將會被關閉以支持上游問題。

我想要在我自己的(Rust)工具中嵌入Cargo Watch

這不推薦直接這麼做。您當然可以像其他程序一樣調用cargo-watch,從技術上講,它暴露了一個(未文檔的)庫,可以直接/靜態嵌入。如果您沒有其他選擇,這可能是最好的選擇。

然而,對於大多數情況,考慮在Watchexec之上建構。它本身是在Notify之上構建的,這兩個都可以用作Rust庫。

  • 如果您想要建立一個在文件變化時運行、重新啟動以及管理命令的工具,您最可能會想使用Watchexec

  • 如果您想要建立一個在文件變化時做出反應的工具,但不需要運行命令,或者以Watchexec不那麼支持的方式運行命令,那麼Notify就是您的選擇。

等等,這只是watchexec的一個包裝器嗎?

有點像!Watchexec在監視文件、運行命令以及所有相關的細節方面做得非常出色。Cargo Watch使用Watchexec庫接口,並使用自己的自定義選項、默認值和特性來調用它,所以您只需在您的項目中運行cargo-watch即可開始工作。

當提問和/或提交錯誤報告時,請記住Cargo Watch和Watchexec目前有相同的維護者(但Notify不再如此)!

關於

Félix Saparelli出色的貢獻者創建。

依賴

~11–40MB
~625K SLoC