当目标架构为 WASM 时默认启用 Cargo 功能?

问题描述 投票:0回答:2

我的板条箱的 Cargo.toml 的一部分:

[features]
wasm = ["ed25519-dalek/nightly", "rand/wasm-bindgen", "js-sys"]

当在另一个项目中使用该板条箱并且明确选择“wasm”功能时,这是有效的。

我想仅当目标架构是 WASM 时自动启用此功能。我尝试添加这个:

#[cfg(target_arch = "wasm32")]
default = ["wasm"]

当我编译 WASM 以外的目标时,“wasm”被包含为默认值,如何仅当目标是 WASM 时才将“wasm”设为默认值?

rust rust-cargo wasm-bindgen
2个回答
7
投票

您只能拥有特定于目标的依赖项,而不能拥有特定于目标的功能。这是一个 已知错误,不幸的是自 2015 年以来就已开放。

人们期望这种语法得到支持,但目前还没有任何计划来实现这一点:

[target.'cfg(target_arch = "wasm32")'.features]
default = ["ed25519-dalek/nightly", "rand/wasm-bindgen", "js-sys"]

作为一个丑陋的解决方法,您可以创建另一个板条箱这取决于您的板条箱并让用户使用这个新板条箱:

[target.'cfg(target_arch = "wasm32")'.dependencies.your_crate]
version = "1.0.0"
features = ["wasm"]

0
投票

我也有同样的问题。

我最终使用

build.rs
在使用特定目标时启用功能。

[target.'cfg(all(target_arch = "wasm32", target_os = "unknown"))'.dependencies]
web-sys = { version = "0.3.64", features = ["Storage", "Window", "console"] }

[features]
sqlite = ["dep:rusqlite", "dbson/rusqlite"]
gui = []
default = ["gui"]

wasm = []

build.rs

pub fn main() {
    if std::env::var("TARGET").expect("Unable to get TARGET").contains("wasm32") {
        println!("cargo:rustc-cfg=feature=\"wasm\"");
    }
}

这里我想在目标为 wasm32-unknown-unknown 时启用

wasm
功能。

请注意,cargo 不支持此操作,并且这是在依赖项解析后运行的。

因此,如果我将

web-sys
设为可选,并使用
wasm = ["dep:web-sys"]
作为一项不起作用的功能。

© www.soinside.com 2019 - 2024. All rights reserved.