Как я могу вызвать сбой компиляции при предупреждениях на CI и установить дополнительные флажки ржавчины в .cargo / config? - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь, чтобы Cargo выдавал предупреждения в CI, но не при локальной разработке.

У меня было рабочее решение, которое должно было установить RUSTFLAGS=“-D warnings” в задании CI. Это сработало хорошо, так как это действительно провалило бы сборку для локальных ящиков, но не для ящиков зависимости (из-за —cap-lints).

В последнее время некоторые ржавые флажки должны были быть установлены (проверены) .cargo/config файл:

[target.’cfg(target_os = “linux”)’]
rustflags = [“some”, “options”]

Это не сработало, поскольку RUSTFLAGS имеет приоритет, а флаги .cargo/config будут игнорироваться. Я не хочу добавлять -D warnings к config, так как это может быть проблемой при разработке.

В настоящее время обходится сценарий, который настраивает config до задания CI:

sed -i "s:\(rustflags = .*\)]:\1, \"-D\", \"warnings\"]:g" .cargo/config
echo '[build]' >> .cargo/config
echo 'rustflags = [ "-D", "warnings"]' >> .cargo/config

Это добавляет -D warnings к существующему rustflags в конфигурации , а создает дополнительную универсальную запись config, которая гарантирует, что -D warnings также включена в сборках CI, отличных от Linux.

Это ужасно нахально; Есть ли лучшее решение, которое я пропускаю?

Возможно, это должен быть запрос функции в репозитории Cargo, но я не знаю, как будет выглядеть идеальное решение.

1 Ответ

0 голосов
/ 03 июля 2019

Вы можете использовать built::util::detect_ci(), чтобы выяснить, выполняется ли текущая сборка под CI. Затем вы можете использовать небольшой скрипт сборки для установки cfg

Cargo.toml

[package]
build = true

[build-dependencies]
built = { version = "0.3", default_features = false }

build.rs

fn main() {
    if let Some(ci) = built::util::detect_ci() {
        // There may be a better way to do this
        println!("cargo:rustc-cfg=DENY_WARNINGS");
        println!("cargo:warning=Denying warnings because we are in CI \"{}\"", ci);
    }
}

Обратите внимание, что результат скрипта сборки кэшируется, поэтому, как только этот скрипт сборки запустится, и Cargo решит, будем ли мы работать под CI или нет, он будет работать с этим результатом, пока вы не измените скрипт сборки или cargo clean. Это не должно быть проблемой ни для местного развития, ни для КИ, если только Скотти не будет вас радовать.

main.rs или lib.rs

#![cfg_attr(DENY_WARNINGS, deny(warnings))]

fn main() {
    // This will be a warning locally but fail to compile e.g. if built on Travis
    Result::<(), ()>::Err(());
}
...