我建议为您的夜间专用代码创建一个feature,该代码默认禁用,即不包含在
Cargo.toml
[features]
default = []
nightly-features = []
由于该功能不是默认功能,因此使用稳定工具链进行编译可以开箱即用。如果您将其命名为nightly-features,您可以分别在您曾经和不想包含在夜间专用版本中的语句、表达式等上使用attributes #[cfg(feature = "nightly-features")] 和#[cfg(not(feature = "nightly-features"))]。此方法的额外好处是允许您(和您的用户)独立于编译器测试夜间功能(即回答以下问题:编译器是否破坏了我的代码,或者我的 nightly-features 代码是否包含错误?)。
尽管有风险,我还是想自动启用夜间功能
使用build scripts,有时称为build.rs。 (注意:永远不要在库中使用以下内容,否则切换编译器可能会成为重大更改。更喜欢上面解释的解决方案)
build.rs(进入包根目录)
use std::env;
fn main() {
let rust_toolchain = env::var("RUSTUP_TOOLCHAIN").unwrap();
if rust_toolchain.starts_with("stable") {
// do nothing
} else if rust_toolchain.starts_with("nightly") {
//enable the 'nightly-features' feature flag
println!("cargo:rustc-cfg=feature=\"nightly-features\"");
} else {
panic!("Unexpected value for rustc toolchain")
}
}
src/main.rs
fn main() {
#[cfg(feature = "nightly-features")]
println!("Hello, nightly!");
#[cfg(not(feature = "nightly-features"))]
println!("Hello, stable!");
}
现在,正在运行
➜ cargo +stable run
Hello, stable!
➜ cargo +nightly run
Hello, nightly!
在夜间编译器上是否可以关闭此功能?
据我所知,没有。由于货物如何将标志传递给 rustc,运行 cargo +nightly run --no-default-features 会保留该功能。程序员可以创建一个特定的环境变量供 build.rs 检查以跳过自动版本检测,但这比没有构建脚本的替代方案更复杂 - cargo build --features=nightly-features