同一份Cargo.toml的两个Rust项目一个编译正常一个报依赖错误如何解决
错误原因
- 核心原因是
crates.io已经下架了pbkdf2 v0.2.0版本:你使用的r2d2-mongodb v0.2.2依赖老旧的mongodb v0.3.12,而该版本mongodb明确要求pbkdf2 = "^0.2.0",没有可用匹配版本时就会触发依赖解析失败。 - 两个相同配置项目表现不一致的原因:构建正常的项目本地存在旧的
Cargo.lock文件,已经锁定了所有依赖的版本,且本地cargo缓存中保留了已下架的pbkdf2 v0.2.0包,不需要重新从crates.io拉取解析。报错项目没有旧的锁定文件,也未缓存对应版本的依赖包,重新解析依赖时找不到匹配版本就会报错。
解决方案
- 方案1(推荐长期使用):升级依赖版本
废弃老旧的r2d2-mongodb包,当前官方mongodb Rust驱动已经内置连接池实现,不需要额外引入r2d2适配包。你可以直接替换为适配你当前Rust版本的官方mongodb驱动,从根本上解决老旧依赖的兼容性问题。 - 方案2(临时兼容,无需改代码):复用旧锁定文件
把可以正常构建的项目根目录下的Cargo.lock文件复制到当前报错项目的根目录,再执行cargo build即可,cargo会直接按照锁定的版本解析依赖,只要本地缓存中存在对应版本的包就能正常构建。 - 方案3(不推荐,存在兼容性风险):强制覆盖依赖版本
在Cargo.toml中添加patch节强制使用高版本pbkdf2,跨大版本无法保证兼容性,可能出现编译或运行时错误,配置示例如下:[patch.crates-io] pbkdf2 = { version = "0.7.5", features = ["legacy"] }
内容的提问来源于stack exchange,提问作者maridob
相关产品推荐
相关产品推荐

