为条件编译定义自定义属性的正确方法是什么?

What is the proper way to define custom attributes for conditional compilation?

我希望能够将一个标志传递给 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 标志重新编译所有板条箱的副作用,如果有一天我的依赖项之一使用此标志,这(除了需要很长时间的事实之外)可能是一个问题。

是否有更好的方法来定义和使用自定义属性?我可以在我的货物清单中添加 feature,但这并不是真正的功能,因为它只是用于测试。

您通常不会重新编译您的应用程序,没有必要:您可以使用环境变量。例如:

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