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

时间:2018-04-08 23:25:06

标签: rust rust-cargo

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

但是,我认为有些情况下使用已知的成功构建lib依赖项是更可取的。即,当依赖项不再由于其自己的依赖项的更新而构建时。

是否有可能将Cargo配置为支持图书馆的Cargo.toml,而不是mongodb = "0.10.*",如果它可用的话?最好是按包装。

更新:以下问题已在0.5.1中修复,其中依赖项现在为Cargo.toml。但是,如果mongodb更新,似乎会重新出现此问题它的bson依赖 - 至少在枯萎的依赖关系再次更新以匹配。或者,正如@Shepmaster在他的回答中提到的那样,直到Cargo FAQ states被实现。)

我的特殊情况是尝试使用包RFC 1977

  • 枯萎mongodb = "<1.0"指定依赖项bson = "<1.0"Cargo.toml
  • mongodb&#39; bson = "0.10.0"指定0.11.1
  • bson的最新版本位于bson 0.10.0

如果不进一步配置依赖关系,bson 0.11.1用于mongodb,Cargo.toml用于枯萎。这导致wither的编译失败,因为它使用bson中的一些结构与mongodb交互。

我当前的解决方法是本地克隆的枯萎副本,并使用已编辑的Cargo.lock来修复其bson版本。但是,wither 0.5.0包含一个已提交的{{1}},这样我至少可以使用此存储库作为我的依赖目标,而不是自己克隆和修改包。

1 个答案:

答案 0 :(得分:2)

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

  

因为它使用bson中的一些结构与mongodb交互。

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

Consolidating cargo dependencies中所述,您可以轻推要合并的依赖项版本:

cargo update -p bson:0.11.1 --precise 0.10.0

另见:

话虽如此,因为的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) (*)
  

似乎不可避免地,bson 0.10.0用于mongodb,而bson 0.11.1用于枯萎。

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