针对Cargo的特定项目覆盖

5

我主要想使用Debian的Rust软件包,而不是从更广泛的互联网上获取一些随机代码(我很传统,我知道,让我们不要进入这个部分)。 为此,我的 ~/.cargo/config.toml 看起来像

[net]
offline = true

[source]

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

[source.debian]
directory = "/usr/share/cargo/registry"

这在我安装所需的librust-*-dev软件包之后非常有效。但是,在某些特定项目中,我想放宽这个规则,并告诉Cargo“嘿,你实际上可以从crates.io获取任何你想要的东西”。根据Cargo书籍,项目特定的/project/.cargo/config.toml应优先于我的用户配置文件。假设这是项目特定的.cargo/config.toml:
[net]
offline = false

[source]

[source.crates-io]

我仍然无法使用外部依赖项来构建一个项目,这些依赖项不在我的替代源中。例如,如果我创建了一个 Cargo.toml 文件,并且它依赖于 yew(一个我知道不在我的替代源中的随机选择的 crate),我就会遇到如下问题:

$ cargo build
error: no matching package found
searched package name: `yew`

我对Cargo的源、替换和项目级别的覆盖有什么误解?
3个回答

2
@blackgreen提出的答案是解决潜在问题的一种可能的解决方法,直到1004510057(或两者的组合)被解决。对于那些需要它的人,以下是另一种也许略微不太糟糕的解决方法。
我最终使用 UnionFS 解决了这个问题(我猜现代的 OverlayFS 也应该能很好地工作)。
我只需添加:
[source.crates-io]
replace-with = "union"

[source.union]
directory = "/home/gspr/.cargo-overlay/union-registry"

将文本添加到我的~/.cargo/config.toml文件中,然后执行。
unionfs -o ro /usr/share/cargo/registry:/home/gspr/.cargo-overlay/local-registry /home/gspr/.cargo-overlay/union-registry

现在,/home/gspr/.cargo-overlay/union-registry 反映了 /usr/share/cargo/registry/home/gspr/.cargo-overlay/local-registry 的并集,在冲突的情况下以前者为优先。
那么~/.cargo-overlay/local-registry 用于什么?个人额外的 crates,方式与 Debian 的 /usr/share/cargo/registry 相同。也就是说,目录名为 cratename-version ,与上游分发的方式相同,但添加了一个额外文件,即 .cargo-checksum.json 。该额外文件的内容可以从 crates.io 索引中提取,如下所示。
假设我们已将 crates.io 索引克隆到 ~/.cargo-overlay/crates.io-index 中。
git clone https://github.com/rust-lang/crates.io-index.git ~/.cargo-overlay/crates.io-index

假设我们已经将版本为0.1.2的crate foo提取到了~/.cargo-overlay/local-registry/foo-0.1.2中。我们可以这样生成缺失的.cargo-checksum.json文件:
cd ~/.cargo-overlay
index_file=$(find crates.io-index -type f -name foo)
cksum=$(jq -r "select(.name == \"foo\" and .vers == \"0.1.2\" ) | .cksum" ${index_file})
jo package="${cksum}" files="{}" > local-registry/foo-0.1.2/.cargo-checksum.json

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"

我们测试发现,似乎无法重用普通的crates.io注册表URL,因为该URL已经被定义并会导致以下错误:
error: source crates-io-mirror defines source registry https://github.com/rust-lang/crates.io-index, but that source is already defined by crates-io note: Sources are not allowed to be defined multiple times.
因此,上面的URL是一个实际的crates.io镜像服务器。然后,您可以在本地项目中成功运行cargo build。请注意,保留HTML标记。

0

最近发布的 Cargo 1.56 添加了一个特性, 正是我问题所需的: 补丁表(patch tables)现在可以在项目特定的.cargo/config.toml中指定,这意味着[patch]框架现在可以在Cargo.toml之外引入。那应该就行了!由于我还要一段时间使用旧版的Cargo,因此我尚未验证此功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接