多个二进制文件的死代码警告?
Dead code warning with multiple binaries?
我注意到,为了使一段代码不被归类为无效代码,它必须可以从所有二进制文件访问。示例:
Cargo.toml:
[[bin]]
name = "main_one"
path = "src/main_one.rs"
[[bin]]
name = "main_two"
path = "src/main_two.rs"
main_one.rs:
mod utils;
fn main() {
print!("Hello, ");
utils::function_in_question();
}
main_two.rs:
mod utils;
fn main() {
print!("Hello, ");
// utils::function_in_question();
}
utils.rs:
pub fn function_in_question() {
println!("world!");
}
这将 function_in_question
报告为死代码,即使它可以从 main_one.rs
访问。取消注释可以解决此问题。如果它仅存在于 main_two.rs
.
中,也可以使用
虽然这种行为背后有一些理由,但 VSCode 一直抱怨这个很烦人 + Clippy 的输出被这些警告垃圾邮件。是否有至少在全球范围内抑制死代码检测的解决方案?应避免使用 cargo workspaces 重组整个项目。
发生这种情况是因为您不只编译 utils.rs
一次 -- 您编译了两次,第一次是 main_one
的一部分,然后是 main_two
的一部分。
我熟悉的模式是将常用项放入lib.rs
,默认编译成一个与你的项目同名的库crate。然后,不用 mod
将它们包含在每个二进制文件中,只需使用库 crate。
# Cargo.toml
[package]
name = "my_crate" # <- will be the name of the library crate
version = "0.1.0"
[dependencies]
# No need for [[bin]] sections if you put the binary sources in src/bin
// src/lib.rs
pub fn function_in_question() {
println!("world!");
}
// src/bin/main_one.rs
fn main() {
print!("Hello, ");
my_crate::function_in_question();
}
// src/bin/main_two.rs
fn main() {
print!("Hello, ");
// my_crate::function_in_question();
}
库 crate 只会被编译一次,因为 function_in_question
是 crate public API 的一部分,你不会看到死代码警告。
请注意,如果将二进制文件放在 src/bin
中,则不需要 Cargo.toml
中的 [[bin]]
部分;有关更多信息,请参阅 。
我注意到,为了使一段代码不被归类为无效代码,它必须可以从所有二进制文件访问。示例:
Cargo.toml:
[[bin]]
name = "main_one"
path = "src/main_one.rs"
[[bin]]
name = "main_two"
path = "src/main_two.rs"
main_one.rs:
mod utils;
fn main() {
print!("Hello, ");
utils::function_in_question();
}
main_two.rs:
mod utils;
fn main() {
print!("Hello, ");
// utils::function_in_question();
}
utils.rs:
pub fn function_in_question() {
println!("world!");
}
这将 function_in_question
报告为死代码,即使它可以从 main_one.rs
访问。取消注释可以解决此问题。如果它仅存在于 main_two.rs
.
虽然这种行为背后有一些理由,但 VSCode 一直抱怨这个很烦人 + Clippy 的输出被这些警告垃圾邮件。是否有至少在全球范围内抑制死代码检测的解决方案?应避免使用 cargo workspaces 重组整个项目。
发生这种情况是因为您不只编译 utils.rs
一次 -- 您编译了两次,第一次是 main_one
的一部分,然后是 main_two
的一部分。
我熟悉的模式是将常用项放入lib.rs
,默认编译成一个与你的项目同名的库crate。然后,不用 mod
将它们包含在每个二进制文件中,只需使用库 crate。
# Cargo.toml
[package]
name = "my_crate" # <- will be the name of the library crate
version = "0.1.0"
[dependencies]
# No need for [[bin]] sections if you put the binary sources in src/bin
// src/lib.rs
pub fn function_in_question() {
println!("world!");
}
// src/bin/main_one.rs
fn main() {
print!("Hello, ");
my_crate::function_in_question();
}
// src/bin/main_two.rs
fn main() {
print!("Hello, ");
// my_crate::function_in_question();
}
库 crate 只会被编译一次,因为 function_in_question
是 crate public API 的一部分,你不会看到死代码警告。
请注意,如果将二进制文件放在 src/bin
中,则不需要 Cargo.toml
中的 [[bin]]
部分;有关更多信息,请参阅