是否可以让 Cargo 始终显示警告?
Is it possible to have Cargo always show warnings?
我正在使用 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
总是给我警告?
仅当 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 "file changed!" 警告,并且还可以在项目目录中的任何位置运行,而不仅仅是根目录。
这是 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
像这样的专用触摸文件的全部意义在于避免在代码编辑器中打开它并避免在工作时出现 "file changed!" 等弹出窗口和警告。
一个解决方案,虽然是暂时的,但是 touch
我很少编辑的文件。这样,我就避免了 this file has been changed
问题,也不需要一直清理整个项目。
此外,我还通过根本不使用 watch
,而只使用 运行 来设法获得颜色(货物没有 --color
选项)以下脚本:
#!/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
运行时输出)
我以前 运行 了解过这个。我使用:
cargo check
从 Rust 1.40 开始,Cargo will cache the compiler messages。这意味着即使代码不需要再次编译,之前的警告也会被打印出来。
生锈 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
我正在使用 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
总是给我警告?
仅当 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 "file changed!" 警告,并且还可以在项目目录中的任何位置运行,而不仅仅是根目录。
这是 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
像这样的专用触摸文件的全部意义在于避免在代码编辑器中打开它并避免在工作时出现 "file changed!" 等弹出窗口和警告。
一个解决方案,虽然是暂时的,但是 touch
我很少编辑的文件。这样,我就避免了 this file has been changed
问题,也不需要一直清理整个项目。
此外,我还通过根本不使用 watch
,而只使用 运行 来设法获得颜色(货物没有 --color
选项)以下脚本:
#!/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
运行时输出)
我以前 运行 了解过这个。我使用:
cargo check
从 Rust 1.40 开始,Cargo will cache the compiler messages。这意味着即使代码不需要再次编译,之前的警告也会被打印出来。
生锈 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