在Cargo.toml或Cargo.lock中设置项目依赖关系的特定版本

时间:2015-01-04 20:30:42

标签: rust rust-cargo

假设我的项目A依赖于依赖库C的库B.

图书馆B将依赖版本设置为“*”(任意),因此货物将下载最新版本的C。

如何指示货物使用特定版本的库C构建库B?


目前我正在尝试构建iron

当前构建失败,但我可以在https://travis-ci.org/iron/iron/builds/45254195中看到上一次成功构建,包括防锈版本和货物包版本。

所以我下载了构建中使用的每晚特定的锈,我通过编辑Cargo.toml设置了铁的直接依赖关系:#/ p>

(...)
[dependencies]
hyper = "0.0.18"
typemap = "0.0.5"
url = "0.2.9"
(...)

但是,生锈序列化,这是“url”和“time”软件包的依赖项,是在最新版本中下载的,不能用我特定的生锈版本编译。

如果我使用上面Travis构建中使用的版本,我确信它会成功编译。

2 个答案:

答案 0 :(得分:2)

当前的想法

我认为您将不得不查看Iron,修改Cargo.toml以指定版本(正如您已经完成的那样)。然后,您需要重复此过程,检出url,修改其Cargo.toml,然后确保您在Iron url中使用的是Cargo.toml版本。冲洗并重复。这听起来很可怕: - (

第一个想法

来自Cargo docs

  

与之前类似,假设您正在开展一个项目uuid,这取决于rand。这次您是rand中发现错误的人,并且您希望编写补丁并能够使用rand中的uuid版本来测试您的补丁}。

     

路径覆盖通过.cargo/config配置机制传达给Cargo。如果Cargo在构建包时发现此配置,它将使用本地计算机上的覆盖而不是Cargo.toml中指定的来源。

     

在该文件中,输入:

paths = ["/path/to/project/rand"]

第二个想法

注意这可能不会奏效。有人在我第一次启动Rust时告诉我的一件事是你可以将同一个库的多个版本编译成一个二进制文件。这意味着没有一个地方可以指定一个适用于所有地方的版本,就像使用Gemfile一样。

您可以简单地为您知道适用于Rust版本的每个依赖项指定版本(或SHA哈希?)。 Cargo应该能够解决传递依赖关系并简单地将您锁定到以前的版本(如果有一个符合所有要求)。

答案 1 :(得分:1)

自从提供了答案后,Cargo已在清单中添加了[patch]部分,您可以执行此用例。

overriding-dependencies