Rust嵌套Crate特性传播失败,如何正确配置?
Rust嵌套Crate特性传递问题:未找到
web_sys::GpuAdapter 问题场景
我有三个嵌套的Rust Crate:
- 库Crate A
- 依赖Crate A的库Crate B
- 依赖Crate B的二进制Crate C
当前各Crate的Cargo.toml配置如下:
CrateA/Cargo.toml
[features] webgpu = [ "web-sys", 'web-sys/Document', 'web-sys/Element', 'web-sys/GpuAdapter', ... ]
CrateB/Cargo.toml
[features] webgpu = ["CrateA/webgpu"] [dependencies] CrateA = {path = "../CrateA", default-features = false}
CrateC/Cargo.toml
[dependencies] CrateB = {path = "../CrateB" , features = ["webgpu"], default-features = false}
构建Crate C时触发如下错误:
error[E0432]: unresolved import `web_sys::GpuAdapter` | 8 | use web_sys::GpuAdapter; | ^^^^^^^^^^^^^^^^^^^ no `GpuAdapter` in the root
已知web_sys::GpuAdapter仅在启用web-sys/GpuAdapter特性时才会被定义,需修正配置让特性正确传递。
解决方案
问题核心是Cargo的特性传递规则没有让web-sys的目标特性在Crate C的依赖树中生效。每个Crate的依赖实例是独立的,若Crate C直接引用web-sys的类型,必须确保该依赖实例的对应特性被启用。
修复步骤
调整Crate B的特性配置:
让webgpu特性不仅传递Crate A的webgpu特性,还要显式关联web-sys的所需特性(若Crate B或Crate C直接使用web-sys类型)。修改CrateB/Cargo.toml:[features] webgpu = [ "CrateA/webgpu", "web-sys/GpuAdapter", "web-sys/Document", "web-sys/Element" ] [dependencies] CrateA = {path = "../CrateA", default-features = false} # 将web-sys声明为可选依赖,通过特性启用 web-sys = {version = "0.3", default-features = false, optional = true}确保Crate C的依赖特性生效:
若Crate C直接引入了web-sys,需在CrateC/Cargo.toml中明确启用对应特性(可选,若已通过Crate B传递则可省略):[dependencies] CrateB = {path = "../CrateB", features = ["webgpu"], default-features = false} # 仅当Crate C直接依赖web-sys时添加 # web-sys = {version = "0.3", default-features = false, features = ["GpuAdapter", "Document", "Element"]}
关键原理
Cargo的特性是针对依赖实例生效的:Crate A启用的web-sys特性仅作用于Crate A自身的web-sys依赖实例,Crate C的web-sys实例(如果直接依赖)需要单独启用特性;若Crate B作为中间层,需通过自身特性把web-sys的特性传递给下游依赖,确保整个依赖树中用到的web-sys实例都启用了目标特性。
内容的提问来源于stack exchange,提问作者YeomHyeonSeop
相关产品推荐
相关产品推荐

