如何使Cargo构建脚本可选?

ble*_*tin 1 build rust rust-cargo

我有一个生成动态(cdylib)库的Rust项目.该项目使用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"
Run Code Online (Sandbox Code Playgroud)

不幸的是,当构建脚本处于活动状态时,RLS(Rust语言服务器)不能很好地工作,这使得在VS代码中编辑相当不愉快.有没有办法使构建脚本运行可选,默认情况下禁用它,并且只在命令行上请求时手动启用它(例如类似的东西cargo build --release --enable-build-scripts)?

ble*_*tin 8

为了扩展@PeterHall 的答案,可以使用 Cargo “功能”部分将信息传递到构建脚本。

将以下行插入到Cargo.toml

[features]
headers = []
Run Code Online (Sandbox Code Playgroud)

然后检查环境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();
    }
}
Run Code Online (Sandbox Code Playgroud)

运行发布版本cargo build --features=headers --release

现在,当 RLS 更新其状态或手动运行时,此解决方案仍然会编译构建脚本和所有 cbindgen 依赖项cargo test。但 cbindgen 运行时错误不再妨碍 RLS。


Pet*_*all 5

您不能通过有条件地禁用构建脚本或将变量传递给它们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
    }
}
Run Code Online (Sandbox Code Playgroud)

使用您的构建脚本构建:

BUILD_ENABLED=1 cargo build
Run Code Online (Sandbox Code Playgroud)

没有您的构建脚本构建:

BUILD_ENABLED=0 cargo build
Run Code Online (Sandbox Code Playgroud)