是否可以让货物始终显示警告?

时间:2015-06-29 20:44:04

标签: rust rust-cargo

我正在watch使用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总是给我警告?

5 个答案:

答案 0 :(得分: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"文件已更改!"警告并且也可以在项目目录中的任何地方运行,而不仅仅是根目录。

答案 1 :(得分: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

像这样的专用触摸文件的全部要点是避免需要在代码编辑器中打开它,并避免出现诸如“文件已更改!”之类的弹出窗口和警告。工作时。

答案 2 :(得分: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运行时的输出)

答案 3 :(得分:0)

从Rust 1.40开始,Cargo will cache the compiler messages。这意味着即使不需要再次编译代码,先前的警告也会被打印出来。

铁锈1.40

private static int checkAdjacentField(int p1, int p2, int[][] ae) {
    int minColIdx = p2 == 0 ? p2 : p2 - 1;
    int minRowIdx = p1 == 0 ? p1 : p1 - 1;
    int maxRowIdx = p1 == ae.length - 1 ? p1 : p1 + 1;

    int result = Integer.MAX_VALUE;

    for (int i = minRowIdx; i <= maxRowIdx; i++) {
        int[] row = ae[i];
        int maxColIdx = p2 == row.length - 1 ? p2 : p2 + 1;
        for (int k = minColIdx; k <= maxColIdx; k++) {
            if (!(p1 == i && p2 == k) && ae[i][k] < result) {
                result = ae[i][k];
            }
        }
    }
    return result;
}

铁锈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 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

答案 4 :(得分:-1)

我以前碰到过这个。我使用:

cargo check