rust 当目标拱门是WASM时,是否默认启用Cargo功能?

hmtdttj4  于 2023-11-19  发布在  Go
关注(0)|答案(2)|浏览(137)

我的Cargo.toml的一部分:

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

字符串
当crate在另一个项目中使用时,这是有效的,并且明确选择了“wasm”特性。
我想仅在目标拱门为WASM时自动启用此功能。我尝试添加以下内容:

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


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

n7taea2i

n7taea2i1#

您只能拥有特定于目标的依赖项,而不是特定于目标的功能。这是一个自2015年以来不幸开放的known bug
人们希望支持这种语法,但现在还没有任何计划来实现这一点:

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

字符串
作为一个丑陋的解决方法,你可以创建另一个依赖于你的crate的crate,让用户使用这个新的crate:

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

8ehkhllq

8ehkhllq2#

我也有同样的问题。
我最终使用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\"");
    }
}


这里我想在目标为wasm 32-unknown-unknown时启用wasm功能。
请注意,cargo不支持此操作,此操作将在依赖项解析后运行。
所以如果我把web-sys设为可选的,并把wasm = ["dep:web-sys"]用作一个不起作用的特性。

相关问题