15

我的项目 A 依赖于依赖于库 C 的库 B。

库 B 将依赖版本设置为"*"(any),因此 Cargo 将下载最新版本的 C。

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


我正在尝试制造

当前构建失败,但我可以看到最后一次成功构建,包括 Rust 和 Cargo 包版本。

我下载了构建中使用的特定 Rust 每晚,并通过编辑 Cargo.toml 将 Iron 的直接依赖项设置为该构建中使用的依赖项:

[dependencies]
hyper = "0.0.18"
typemap = "0.0.5"
url = "0.2.9"

rust-serialized,它是urltime包的依赖项,作为最新版本下载,它不能与我的特定 Rust 版本一起编译。

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

4

2 回答 2

7

手动编辑

您可以查看 Iron,修改Cargo.toml以指定版本(正如您已经完成的那样)。然后你重复这个过程,检查url,修改它Cargo.toml,然后确保你使用的是你url在 Iron's 中的版本Cargo.toml。冲洗并重复。

补丁覆盖

来自货物文档

[patch]部分Cargo.toml可用于覆盖与其他副本的依赖关系。语法类似于以下[dependencies]部分:

[patch.crates-io]
foo = { git = 'https://github.com/example/foo' }
bar = { path = 'my/local/bar' }

源可以使用不存在的 crate 版本进行修补,也可以使用已经存在的 crate 版本进行修补。如果使用源中已经存在的 crate 版本修补源,则替换源的原始 crate。

路径覆盖

来自货物文档

有时你只是暂时在一个 crate 上工作,你不想像上面Cargo.toml[patch]部分那样修改。对于这个用例,Cargo 提供了一个更有限的覆盖版本,称为路径覆盖

路径覆盖是通过.cargo/config.toml而不是指定的Cargo.toml.cargo/config.toml您将在其中指定一个名为 的键paths

paths = ["/path/to/uuid"]

具体版本

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

或者,您可以使用cargo update -p somecrate --precise major.minor.patch指定 crate 的确切版本并将其记录在您的Cargo.lock.

这可能不适用于所有情况;Rust 可以将同一个库的多个版本编译成一个二进制文件。这意味着没有一个地方可以指定一个适用于所有地方的版本。

解决赏金问题

约翰补充道

我有一个依赖于 zstd 的板条箱。zstd 依赖于 zstd 安全。zstd-safe 依赖于 zstd-sys。我的 crate 链接到一个 C++ 二进制文件,该二进制文件也将 zstd 作为一个 C 库链接。zstd C 库的版本和 zstd-sys 提供的 zstd 版本必须完全匹配,否则会出现链接错误。所以我想固定一个精确版本的 zstd-sys

这种情况可以遵循上面的“特定版本”示例,但是因为 zstd-sys使用一个密钥,所以在整个 crate 图中links只能有一个该 crate。这意味着您可以添加zstd-sys到您的顶级依赖项,并且如果引入了冲突的版本,Cargo 会抱怨:

[dependencies]
zstd = "0.9.0"
zstd-sys = "=1.6.1"

如果我编辑它以指定版本 1.6.0,我会收到一个错误:

error: failed to select a version for `zstd-sys`.
    ... required by package `zstd-safe v4.1.1+zstd.1.5.0`
    ... which is depended on by `zstd v0.9.0+zstd.1.5.0`
    ... which is depended on by `so v0.1.0 (/private/tmp/so)`
versions that meet the requirements `=1.6.1` are: 1.6.1+zstd.1.5.0

the package `zstd-sys` links to the native library `zstd`, but it conflicts with a previous package which links to `zstd` as well:
package `zstd-sys v1.6.0+zstd.1.5.0`
    ... which is depended on by `so v0.1.0 (/private/tmp/so)`
于 2015-01-04T20:43:11.773 回答
1

由于提供了 anwser,Cargo 已将该[patch]部分添加到清单中,允许您执行此用例。

压倒一切的依赖

于 2019-12-12T02:24:28.600 回答