在解析包版本时,我可以强制使用依赖项的 Cargo.lock 吗?

Can I force the use of my dependencies' Cargo.lock when resolving package versions?

Cargo.lockCargo FAQ states 不用于库,而是使用 Cargo.toml 中找到的依赖版本范围,以减少共享依赖项之间的库重复。

但是,我认为在某些情况下,最好使用已知的成功构建的 lib 依赖项。也就是说,当一个依赖项由于其 自己的 依赖项的更新而不再构建时。

是否可以将 Cargo 配置为支持图书馆的 Cargo.lock 而不是 Cargo.toml(如果可用)?最好按包裹分类。


(更新: 下面的问题已经在wider 0.5.1 中修复,现在的依赖是mongodb = "0.10.*"。但是,这个问题似乎会重新-如果 mongodb 更新其 bson 依赖项,则出现 - 至少直到再次更新凋灵的依赖项以匹配。或者,正如@Shepmaster 在他的回答中提到的那样,直到 RFC 1977 实现。)

我的特殊情况是尝试使用包 wither 0.5.0:

不进一步配置依赖,bson 0.10.0用于mongodb,bson 0.11.1用于wither。这会导致编译 Wither 失败,因为它使用 bson 中的一些结构与 mongodb.

交互

我目前的解决方法是在本地克隆一个 Wither 副本,并编辑 Cargo.toml 以修复其 bson 版本。然而,git repository 包含一个已提交的 Cargo.lock,这将允许我至少使用这个存储库作为我的依赖目标,而不是自己克隆和修改包。

不,您不能使用图书馆的 Cargo.lock。

as it uses some structures from bson to interact with mongodb.

这是根本问题。目前,依赖解析器不知道一个 crate 在 public 接口中暴露了另一个 crate 的类型。这将在实施 RFC 1977 时解决。

Consolidating cargo dependencies所述,您可以调整要合并的依赖项的版本:

cargo update -p bson:0.11.1 --precise 0.10.0

另请参阅:

  • Consolidating cargo dependencies
  • Set specific version of the dependency of a project's dependency in Cargo.toml or Cargo.lock

也就是说,因为 的 semver,你的代码工作得很好:

[dependencies]
wither = "0.5.1"
mongodb = "0.3.7"
$ cargo tree --invert -p bson
bson v0.10.0
├── mongodb v0.3.7
│   ├── example v0.1.0 (file:///private/tmp/example)
│   └── wither v0.5.1
│       └── example v0.1.0 (file:///private/tmp/example) (*)

Seemingly unavoidably, bson 0.10.0 is used for mongodb, and bson 0.11.1 is used for wither.

事实并非如此,您可以通过 (a) 上面的示例和 (b) 您自己关于可接受版本范围的陈述来判断。