Как я могу сделать запуск скрипта сборки Cargo необязательным? - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть проект Rust, который генерирует динамическую (cdylib) библиотеку.В проекте используется сценарий сборки cbindgen для создания соответствующего файла заголовка C, соответствующего экспортируемым функциям библиотеки.Cargo.toml выглядит так:

[package]
name = "example"
version = "0.1.0"
authors = ["Me <me@foo.bar>"]
build = "build.rs"

[lib]
name = "example"
crate-type = ["cdylib"]

[dependencies]

[build-dependencies]
cbindgen = "0.6.2"

К сожалению, RLS (Rust Language Server) не очень хорошо работает, когда скрипт сборки активен, что делает редактирование в VS Code довольно неприятным.Есть ли способ сделать запуск сценария сборки необязательным, отключив его по умолчанию и включив его вручную только при запросе в командной строке (например, что-то вроде cargo build --release --enable-build-scripts)?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Чтобы расширить ответ от @PeterHall, можно использовать секцию Cargo "features" для передачи информации в скрипт сборки.

Вставьте следующие строки в Cargo.toml:

[features]
headers = []

Затем проверьте переменную среды CARGO_FEATURE_HEADERS в build.rs:

use std::env;

fn write_headers() {
    // call cbindgen ...
}

fn main() {
    let headers_enabled = env::var_os("CARGO_FEATURE_HEADERS").is_some();
    if headers_enabled {
        write_headers();
    }
}

Чтобы запустить сборку выпуска cargo build --features=headers --release.

Теперь это решение по-прежнемукомпилирует скрипт сборки и все зависимости cbindgen, когда RLS обновляет свой статус или когда cargo test запускается вручную.Но ошибки времени выполнения cbindgen больше не мешают RLS.

0 голосов
/ 20 сентября 2018

Вы не можете условно отключить сценарии сборки или передать им переменные через cargo build, но вместо этого вы можете использовать переменные среды.

Внутри build.rs:

use std::env;

fn main() {  
    let build_enabled = env::var("BUILD_ENABLED")
        .map(|v| v == "1")
        .unwrap_or(true); // run by default

    if build_enabled {
        // do your build
    }
}

Сборка с использованием сценария сборки:

BUILD_ENABLED=1 cargo build

Сборка без сценария сборки:

BUILD_ENABLED=0 cargo build
...