【问题标题】:What is the proper way to define custom attributes for conditional compilation?为条件编译定义自定义属性的正确方法是什么?
【发布时间】:2020-03-27 07:09:06
【问题描述】:

我希望能够将标志传递给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,但这并不是真正的功能,因为它只是用于测试。

【问题讨论】:

    标签: testing rust conditional-compilation


    【解决方案1】:

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

    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

    【讨论】:

    • 虽然这不能直接回答问题,但这似乎是解决我原来启用/禁用日志问题的正确方法,所以我接受了它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    相关资源
    最近更新 更多