cargo publish时依赖版本与本地构建不一致如何解决
cargo publish 流程依赖版本不一致导致编译失败问题
问题现象
- 对自有库执行
cargo publish操作时出现项目编译失败,故障原因为发布流程中使用了不一致的依赖版本,但执行cargo build时项目可正常编译。 - 发布流程日志显示同时编译了
bitcoin依赖的两个不同版本:
Compiling bitcoin v0.27.1 Compiling bitcoin v0.28.1
后续编译失败正是由于部分依赖使用 bitcoin 0.27.1、部分依赖使用 0.28.1 导致版本不兼容。
- 根目录
Cargo.toml中已明确指定依赖为bitcoin = "=0.27.1",查看Cargo.lock文件仅存在 0.27.1 的版本条目,无其他版本记录;cargo tree的输出也仅显示 bitcoin 0.27.1 版本,cargo build编译全程也仅使用 0.27.1 版本,完全无法定位cargo publish流程中 0.28.1 版本的来源。 - 尝试添加
--locked、--frozen参数,希望cargo publish遵循Cargo.lock的版本锁定规则,但未产生任何效果。
排查进展
- 发现某条依赖声明了
bitcoin = ">= 0.27"的版本规则,Cargo 为该依赖选择了符合版本范围的最新版 0.28.1,其余依赖则使用 0.27.1,最终触发不兼容问题,需要实现强制全局使用统一依赖版本的配置。 - 执行
cargo tree --all-features查看完整的版本冲突依赖树,结构如下:
├── bitcoin v0.27.1 . ├── emerald-hwkey v0.2.0 │ ├── bitcoin v0.27.1 (*) │ ├── hdpath v0.6.1 │ │ ├── bitcoin v0.28.1
其中hdpath v0.6.1的Cargo.toml对 bitcoin 的版本声明为:
bitcoin = { version = ">= 0.27", optional = true }
Cargo 单独升级该依赖对应的 bitcoin 版本导致全链路依赖不兼容的原因暂不明确。
3. 测试验证发现,如果使用本地修改版 hdpath,将其 bitcoin 版本限制为">= 0.27, < 0.28"即可正常完成发布,但该方案不可接受:hdpath 本身可兼容 0.27、0.28 两个系列的 bitcoin 版本,无理由添加该版本上限限制。需求为让 hdpath 使用与父项目兼容的 bitcoin 版本,确认是否有官方支持的配置方式可实现该需求。
内容的提问来源于stack exchange,提问作者Igor Artamonov
相关产品推荐
相关产品推荐

