我希望能够将一个标志传递给 cargo test
,以便在我需要调试测试时启用日志记录。
我想出了类似的东西:
#[cfg(logging)]
// An internal module where I define some helper to configure logging
// I use `tracing` internally.
use crate::logging;
#[test]
fn mytest() {
#[cfg(logging)]
logging::enable();
// ..
assert!(true);
}
然后我可以启用日志
RUSTFLAGS="--cfg logging" cargo test
它有效,但感觉就像我在滥用 rustc 标志系统。它还具有使用我的 logging
标志重新编译所有 crate 的副作用,如果有一天我的依赖项之一使用此标志(除了需要很长时间的事实),这可能会成为一个问题。
是否有更好的方法来定义和使用自定义属性?我可以在我的 cargo list 中添加一个功能
,但这并不是真正的功能,因为它只是用于测试。
最佳答案
您通常不会重新编译您的应用程序,没有必要:您可以使用环境变量。例如:
if std::env::var("MY_LOG").is_ok() {
logging::enable();
}
然后,您可以通过调用您的应用程序来动态决定记录
MY_LOG=true cargo run
或者,当已经编译时,
MY_LOG=true myapp
您通常不仅仅需要配置日志是否打开,例如日志级别或级别目标。这是一个真实的例子:https://github.com/Canop/broot/blob/master/src/main.rs#L20
关于testing - 为条件编译定义自定义属性的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60881384/