Build 如何使运行货物构建脚本成为可选的?

Build 如何使运行货物构建脚本成为可选的?,build,rust,rust-cargo,Build,Rust,Rust Cargo,我有一个生成动态(cdylib)库的Rust项目。该项目使用构建脚本创建相应的C头文件,与库的导出函数相匹配货物。toml如下所示: [package] name = "example" version = "0.1.0" authors = ["Me <me@foo.bar>"] build = "build.rs" [lib] name = "example" crate-type = ["cdylib"] [dependencies] [build-dependencie

我有一个生成动态(cdylib)库的Rust项目。该项目使用构建脚本创建相应的C头文件,与库的导出函数相匹配<代码>货物。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"
[软件包]
name=“示例”
version=“0.1.0”
作者=[“我”]
build=“build.rs”
[lib]
name=“示例”
板条箱类型=[“cdylib”]
[依赖关系]
[生成依赖项]
cbindgen=“0.6.2”

不幸的是,当构建脚本处于活动状态时,RLS(Rust Language Server)不能很好地工作,这使得在VS代码中进行编辑非常不愉快。是否有一种方法可以使运行构建脚本成为可选的,默认情况下禁用它,并且只有在命令行上请求时才手动启用它(例如,类似于
cargo build--release--enable build scripts
)?

您不能有条件地禁用构建脚本或通过
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
    }
}
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();
    }
}
使用构建脚本进行构建:

BUILD\u ENABLED=1货物构建
不使用生成脚本生成:

BUILD\u ENABLED=0货物构建

要扩展@PeterHall的答案,可以使用Cargo部分将信息传递给构建脚本

将以下行插入到
Cargo.toml

[features]
headers = []
然后检查
build.rs
中的环境变量
CARGO\u FEATURE\u HEADERS

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
    }
}
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


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

请参阅。我相信答案是利用环境variables@PeterHall:是否可以使用功能条目启用/禁用生成依赖项?由于功能在构建过程中从Cargo命令行转发到环境变量,这似乎与您的建议很好地结合在一起。我还没有尝试过这一点-也许让我们知道您是否可以让它工作!我认为环境变量本身非常方便。不幸的是,Windows
cmd
shell不支持将环境变量作为前缀添加到实际的命令行中。因此,我正在寻找一些基于Cargo“功能”的解决方案。“不幸的是,Windows cmd shell不支持将环境变量作为前缀添加到实际的命令行”-怎么样?单独的自我回答也可以。你会得到荣誉的。我不知道Cargo特性被翻译成了这样的环境变量!