17

我正在使用watchwith cargo,以便快速查看编译时错误。但是,cargo build只会在第一次构建时显示错误。

$ cargo build
Compiling clayman v0.0.1
src/core_math/vector.rs:8:5: 13:6 warning: method is never used: `New`, #[warn(dead_code)] on by default
src/core_math/vector.rs:8     pub fn New(x: i32, y: i32) -> Vector {
src/core_math/vector.rs:9         Vector {
src/core_math/vector.rs:10             x: x,
src/core_math/vector.rs:11             y: y
src/core_math/vector.rs:12         }
src/core_math/vector.rs:13     }
src/core_math/vector.rs:8:5: 13:6 warning: method `New` should have a snake case name such as `new`, #[warn(non_snake_case)] on by default
src/core_math/vector.rs:8     pub fn New(x: i32, y: i32) -> Vector {
src/core_math/vector.rs:9         Vector {
src/core_math/vector.rs:10             x: x,
src/core_math/vector.rs:11             y: y
src/core_math/vector.rs:12         }
src/core_math/vector.rs:13     }
src/main.rs:28:9: 28:10 warning: unused variable: `v`, #[warn(unused_variables)] on by default
src/main.rs:28     let v: vector::Vector;
                   ^
$ cargo build
$

这意味着我只能在几秒钟内看到警告,然后才能watch给我一个清晰的屏幕。

有没有办法cargo build让我总是给我警告?

4

5 回答 5

5

从 Rust 1.40 开始,Cargo 将缓存编译器消息。这意味着即使代码不需要再次编译,之前的警告也会被打印出来。

锈 1.40

% cargo build
   Compiling warnings v0.1.0 (/private/tmp/warnings)
warning: unused variable: `a`
 --> src/main.rs:2:9
  |
2 |     let a = 42;
  |         ^ help: consider prefixing with an underscore: `_a`
  |
  = note: `#[warn(unused_variables)]` on by default

    Finished dev [unoptimized + debuginfo] target(s) in 1.58s

% cargo build
warning: unused variable: `a`
 --> src/main.rs:2:9
  |
2 |     let a = 42;
  |         ^ help: consider prefixing with an underscore: `_a`
  |
  = note: `#[warn(unused_variables)]` on by default

    Finished dev [unoptimized + debuginfo] target(s) in 0.00s

锈 1.39

% cargo build
   Compiling warnings v0.1.0 (/private/tmp/warnings)
warning: unused variable: `a`
 --> src/main.rs:2:9
  |
2 |     let a = 42;
  |         ^ help: consider prefixing with an underscore: `_a`
  |
  = note: `#[warn(unused_variables)]` on by default

    Finished dev [unoptimized + debuginfo] target(s) in 0.42s

% cargo build
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
于 2019-12-13T14:26:23.950 回答
4

只有当 Rust 重新编译你的文件时才会出现警告;但是它会尽可能多地缓存,如果没有更改,它会很高兴地跳过无用的编译。Cargo 目前没有强制重建的选项。

一个快速而肮脏但易于设置的解决方案是touch您的源文件,以便 Cargo 认为它们已更改:

$ cd /path/to/project/root
$ ls
Cargo.lock Cargo.toml src        target
$ cargo build
     Compiling abc v0.1.0 (file:///private/tmp/b/abc)
  src/main.rs:2:9: 2:10 warning: unused variable: `x`, #[warn(unused_variables)] on by default
  src/main.rs:2     let x: u8 = 123;
                        ^
$ cargo build
$ touch $(find src)
$ cargo build
     Compiling abc v0.1.0 (file:///private/tmp/b/abc)
  src/main.rs:2:9: 2:10 warning: unused variable: `x`, #[warn(unused_variables)] on by default
  src/main.rs:2     let x: u8 = 123;
                        ^

另一种可能更好的解决方案是清除target包含二进制工件的目录,使用cargo clean

$ cargo build
   Compiling abc v0.1.0 (file:///private/tmp/b/abc)
src/main.rs:2:9: 2:10 warning: unused variable: `x`, #[warn(unused_variables)] on by default
src/main.rs:2     let x: u8 = 123;
                      ^
$ cargo build
$ cargo clean
$ cargo build
   Compiling abc v0.1.0 (file:///private/tmp/b/abc)
src/main.rs:2:9: 2:10 warning: unused variable: `x`, #[warn(unused_variables)] on by default
src/main.rs:2     let x: u8 = 123;
                      ^

它的优点是不会触发 Vim “文件已更改!” 警告,并且也可以在项目目录中的任何位置运行,而不仅仅是根目录。

于 2015-06-29T20:59:02.077 回答
1

这是 mdups 答案中描述的触摸模式的另一种变体。

使用此命令检查类型错误并在每次运行时显示所有警告,即使没有发生代码更改:

touch src/my_tra_la_la.rs && clear && clear && cargo check

clear && clear &&部分与此答案几乎无关,但对我来说,它是每个构建命令的强制性部分,以避免新输出在视觉上与上一次运行的输出合并。

它需要两件事,首先mod my_tra_la_la;是在main.rs,或者lib.rs如果它是一个库。

第二部分是可选的,但我认为向这个特殊的源文件添加一些文档很好,src/my_tra_la_la.rs

//! The only purpose of this file is to act as a target for the `touch` command
//! in order to force recompilation of this otherwise meaningless file and in
//! turn to force rustc to display warnings, every time.
//!
//! touch src/my_tra_la_la.rs && clear && clear && cargo check
//!
//! Mmm...my ding ding dong

像这样的专用触摸文件的全部意义在于避免在代码编辑器中打开它并避免弹出窗口和警告,如“文件已更改!” 工作时候。

于 2018-08-28T17:24:58.147 回答
0

一个解决方案,尽管是暂时的,是针对touch我很少编辑的文件。这样,我就避免了这个this file has been changed问题,也不需要一直清理整个项目。

此外,我还设法获得了颜色(货物没有--color选项),根本不使用watch,而是简单地运行以下脚本:

#!/bin/sh
while :
do
    script -qc "cargo build" /dev/null > .tmp
    clear
    cat .tmp
    sleep 2 # or whatever
    touch src/somefile.rs
done

我正在写作和阅读的原因.tmp是让所有输出都出现在一个(rustc运行时输出)

于 2018-10-03T13:32:48.040 回答
-3

我以前遇到过这个。我用:

cargo check
于 2019-04-11T15:49:43.340 回答