2016-07-25 50 views
12

我有一个项目具有对iron>= 0.3, <= 0.4的依赖关系(cookie工具)。合并货物依赖关系

我的项目依赖铁0.3(所以我可以使用router中间件,尚未更新到最新的铁)。

当我尝试编译我的项目时,cookie实用程序会拉动0.4版本的铁,并且由于使用了不同版本的铁,所以出现错误。

不过,我可以这样做:

cargo update -p <cookie utility> 

这(通常)变化对铁匹配我现在用的是一个包的依赖,并移除铁0.4外来的依赖。 (奇怪的是,我有时必须在更新之前运行该命令几次。)

显然,我无法指定依赖项的依赖版本:Set specific version of the dependency of a project's dependency in Cargo.toml or Cargo.lock

如果货物可能会猜测我想使用单一版本的铁,但我明白为什么它不能。然而,我很困惑为什么cargo update -p <package>实际上工作;它会更新软件包的依赖关系似乎并不直观。


我想我的第一个真正的问题是:我怎么能指定依赖的依赖版本(当且仅当我想要的版本是支持的版本范围的图书馆内)?我不认为在上面提到的问题中提出的解决方案是理想的。我觉得如果Cargo能够很好地支持这一点会更好,这样图书馆就可以让他们的依赖版本范围保持开放,因为它们的功能允许。

与此同时,我发现这个“诡计”,似乎做我想要的(cargo update -p <pkg>)。我没有看起来超级难过,但这种行为似乎没有在任何明显的地方描述。我的第二个问题是:这是合并依赖关系的有效方法吗?有什么地方可以找到关于这方面的更多信息吗?


和步骤重现:

  1. 创建一个新项目:cargo new --bin ironapp; cd ironapp
  2. 创建cookie依赖关系:cargo new cookie_util
  3. cookie_util/Cargo.toml添加一个依赖项:iron = ">= 0.3, <= 0.4"
  4. Cargo.toml中添加两个依赖项:iron = "0.3.0"cookie_util = { path = "cookie_util"}
  5. cargo build。确认Cargo.lock需要两种铁质版本。
  6. 运行cargo update -p cookie_util任何地方在1和4(或更多)次之间。最终它将消除对iron 0.4.0的依赖。

我刚刚在rustc-1.10.0/cargo-0.11.0上测试了这个。我确信targetCargo.lock都没有在第1步的开始。

+2

这可能值得创建一个问题[这里](https://github.com/rust-lang/cargo/issues)。 – squiguy

+1

我第二次来自@squiguy的评论;创建一个问题。但是,请确保您在提交问题时提供[MCVE] **。和这里。 – Shepmaster

+0

感谢您的意见。我试图澄清我的问题 –

回答

5

通过阅读cargo/issues/2064的评论,我意识到解决这些类型依赖性的更强大的方法是使用--precise标志。以我为例,

cargo update -p iron:0.4.0 --precise 0.3.0 

消除不必要的依赖关系。这需要挖掘Cargo.lock并手动确定依赖关系可以收敛的位置,但远远好于运行cargo update -p <pkg>并希望获得最佳效果,或者手动编辑Cargo.lock