Я хочу условно включить проверки и ведение журнала во время выполнения независимо друг от друга, а также от режима отладки и выпуска. Таким образом, я начал добавлять две функции в мой проект, одна из которых называется "проверка инвариантов", а другая - "регистрация". В конечном счете, я хочу, чтобы их использование проходило через макросы, которые я определяю в ящике, видимом для всего проекта.
Я предполагал, что если заполнить секцию функций одинаково во всех ящиках одинаково, тогда, когда я активировал эту функцию во время компиляции ящика, тогда все ящики библиотеки также включите эту функцию, но это не так! Как я могу включить и отключить функции в нескольких ящиках? Надеемся, что это можно сделать, изменив только одну вещь, например аргументы командной строки, на Cargo.
Чтобы уточнить, что именно я хочу, вот пример , который я также воспроизведу ниже:
Существует три ящика: основной, мусорный ящик, ящик и два ящика для библиотек, которые называются «средние» и «общие». Вот соответствующие части соответствующих файлов:
main.rs
extern crate common;
extern crate middle;
fn main() {
common::check!();
middle::run();
println!("done");
}
основной груз.томл
[dependencies]
[dependencies.common]
path = "libs/common"
[dependencies.middle]
path = "libs/middle"
[features]
default = []
invariant-checking = []
logging = []
среднего lib.rs
extern crate common;
pub fn run() {
common::check!();
common::run();
}
середина Cargo.toml
[dependencies]
[dependencies.common]
path = "../common"
[features]
default = []
invariant-checking = []
logging = []
общие lib.rs
#[macro_export]
macro_rules! check {
() => {{
if cfg!(feature = "invariant-checking") {
println!("invariant-checking {}:{}", file!(), line!());
}
if cfg!(feature = "logging") {
println!("logging {}:{}", file!(), line!());
}
}};
}
pub fn run() {
check!()
}
и, наконец, обычные Cargo.toml
[dependencies]
[features]
default = []
invariant-checking = []
logging = []
Когда я запускаю cargo run --features "invariant-checking,logging"
, я получаю следующий вывод
invariant-checking src\main.rs:5
logging src\main.rs:5
done
но вы хотите, чтобы он входил в средний и общий, а также. Как я могу преобразовать этот проект так, чтобы он это сделал, и все же позволить мне получить только «готово» в качестве результата, изменив только одно место?