手动编辑
您可以查看 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)`