Как правильно определить пользовательские атрибуты для условной компиляции? - PullRequest
1 голос
/ 27 марта 2020

Я хотел бы иметь возможность передать флаг 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 к моему манифесту go, но это не особенность, так как это только для тестов.

1 Ответ

3 голосов
/ 27 марта 2020

Обычно вы не перекомпилируете свое приложение, в этом нет необходимости: вы можете использовать переменную окружения. Например:

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

...