为条件编译定义自定义属性的正确方法是什么?
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
我希望能够将一个标志传递给 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