我的项目 A 依赖于依赖于库 C 的库 B。
库 B 将依赖版本设置为"*"(any),因此 Cargo 将下载最新版本的 C。
如何指示 Cargo 使用特定版本的库 C 构建库 B?
我正在尝试建造铁。
当前构建失败,但我可以看到最后一次成功构建,包括 Rust 和 Cargo 包版本。
我下载了构建中使用的特定 Rust nightly,并通过编辑 Cargo.toml 将铁的直接依赖项设置为该构建中使用的依赖项:
[dependencies]
hyper = "0.0.18"
typemap = "0.0.5"
url = "0.2.9"
Run Code Online (Sandbox Code Playgroud)
rust-serialized,它是url和time包的依赖项,下载为最新版本,该版本不与我的特定 Rust 版本一起编译。
如果我使用上面 Travis 构建中使用的版本,我相信它会成功编译。
She*_*ter 12
您可以查看 Iron,修改Cargo.toml以指定版本(正如您已经完成的那样)。然后重复这个过程,检查url、修改它Cargo.toml,然后确保您使用的url是 Iron 的版本Cargo.toml。冲洗并重复。
来自货物文档:
[patch]的部分可Cargo.toml用于覆盖与其他副本的依赖关系。语法类似于以下[dependencies]部分:Run Code Online (Sandbox Code Playgroud)[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:Run Code Online (Sandbox Code Playgroud)paths = ["/path/to/uuid"]
您也许可以简单地为您知道适用于您的 Rust 版本的每个依赖项指定版本(或 SHA 哈希值)。如果有满足所有要求的版本,Cargo 应该能够解决传递依赖关系并将您锁定到以前的版本。
或者,您可以用来cargo update -p somecrate --precise major.minor.patch指定 crate 的确切版本并将其记录在您的Cargo.lock.
这可能并不适用于所有情况;Rust 可以将同一库的多个版本编译成一个二进制文件。这意味着没有一个地方可以指定一个适用于所有地方的版本。
我有一个依赖于 zstd 的板条箱。zstd 依赖于 zstd-safe。zstd-safe 依赖于 zstd-sys。我的板条箱链接到一个 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"
Run Code Online (Sandbox Code Playgroud)
如果我编辑此内容以指定版本 1.6.0,则会收到错误:
[patch.crates-io]
foo = { git = 'https://github.com/example/foo' }
bar = { path = 'my/local/bar' }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5446 次 |
| 最近记录: |