Cargo 的项目特定覆盖

gsp*_*spr 5 dependency-management rust-cargo

我主要想使用 Debian 的 Rust 包,而不是从更广泛的互联网上获取一些随机代码(我知道,我很守旧,我们不要进入这部分)。为此,我的~/.cargo/config.toml样子

[net]
offline = true

[source]

[source.crates-io]
replace-with = "debian"

[source.debian]
directory = "/usr/share/cargo/registry"
Run Code Online (Sandbox Code Playgroud)

librust-*-dev在我安装了我想要的软件包后,这非常有效。然而,在一些特定的项目中,我想取消这条规则并告诉 Cargo“嘿,你实际上可以疯狂地从 crates.io 获取任何你想要的东西”。根据Cargo book,特定于项目的项目/project/.cargo/config.toml应该优先于我的用户项目。假设该项目特定.cargo/config.toml

[net]
offline = false

[source]

[source.crates-io]
Run Code Online (Sandbox Code Playgroud)

我仍然无法使用cargo build来自替换源之外的依赖项的项目。例如,如果我制作一个Cargo.toml取决于yew(随机选择的板条箱,我知道在我的替换源中不可用)我得到

$ cargo build
error: no matching package found
searched package name: `yew`
Run Code Online (Sandbox Code Playgroud)

我对 Cargo 的来源、替换和每个项目的覆盖有什么误解?

bla*_*een 1

看起来您似乎遇到了这个问题:https://github.com/rust-lang/cargo/issues/8687

您想取消设置上层的配置键config.toml,但这不受支持。

我对配置进行了一些操作,让它工作的唯一方法是在项目本地覆盖config.toml上层config.toml.

在你的情况下,你的上层config.toml指定了replace-with,所以你必须覆盖它。但是您不能用crates-io您要使用的注册表覆盖它,因为那正是带有密钥的注册表replace-with

因此,在解决上述问题之前,我们本质上必须在配置中使用镜像并作为实际的注册表来下载:

[net]
offline = false

[source]

[source.crates-io]
replace-with = "crates-io-mirror"

[source.crates-io-mirror]
registry = "https://gitlab.com/integer32llc/crates.io-index"
Run Code Online (Sandbox Code Playgroud)

正如我们都测试的那样,似乎无法重用正常的 crates.io 注册表 url,因为它已经定义并且会失败:

错误:源 crates-io-mirror 定义了源注册表https://github.com/rust-lang/crates.io-index,但该源已由 crates-io 定义 注意:不允许多次定义源。

因此,上面的 URL 是 crates.io 的实际镜像服务器。然后就可以cargo build在本地项目中运行成功了。