为async-graphql添加tracing特性触发Cargo版本冲突错误
依赖版本冲突原因解析
你给async-graphql添加tracing特性的配置如下:
async-graphql = { version = "6.0.11", default-features = false, features = [ "tracing", ] }
遇到的编译错误:
error: failed to select a version for `futures-executor`. ... required by package `futures v0.3.29` ... which satisfies dependency `futures = "^0.3.28"` (locked to 0.3.29) of package `cmd v0.1.0 (C:\prj\src\cmd)` versions that meet the requirements `^0.3.29` are: 0.3.29 all possible versions conflict with previously selected packages. previously selected package `futures-executor v0.3.28` ... which satisfies dependency `futures-executor = "^0.3"` (locked to 0.3.28) of package `opentelemetry_sdk v0.21.1` ... which satisfies dependency `opentelemetry_sdk = "^0.21"` (locked to 0.21.1) of package `worker v0.1.0 (C:\prj\src\worker)` ... which satisfies path dependency `worker` (locked to 0.1.0) of package `cmd v0.1.0 (C:\prj\src\cmd)` failed to select a version for `futures-executor` which could resolve this conflict
错误原因
这是典型的Cargo依赖版本冲突问题:
- 添加
tracing特性后,async-graphql及其依赖链要求futures库升级到v0.3.29,而futuresv0.3.29对futures-executor的版本要求是^0.3.29(即最低0.3.29版本)。 - 你的项目中
opentelemetry_sdkv0.21.1已经在Cargo.lock中锁定了futures-executorv0.3.28,且该包通过worker路径依赖被cmd包引用。 - 虽然
opentelemetry_sdk对futures-executor的声明依赖是^0.3(理论上兼容0.3.x全系列),但Cargo.lock一旦生成,默认会保留已锁定的版本,不会自动升级来满足新的依赖要求,导致两个版本要求无法调和。
即便你更新了所有依赖,opentelemetry_sdk v0.21.1本身是较旧的版本,它的依赖约束在配合已锁定的版本时,和新引入的futures v0.3.29的要求产生了冲突。
内容的提问来源于stack exchange,提问作者Fred Hors
相关产品推荐
相关产品推荐

