12

如何禁用cargo updatecargo build尝试访问 github.com;但仍然从下载适当的包crates.io

我的 cargo.toml 中有一个依赖项

[dependencies]
chrono = "0.2.14"

跑步cargo build

E:\>cargo build
    Updating registry `https://github.com/rust-lang/crates.io-index`
Unable to update registry https://github.com/rust-lang/crates.io-index

我们被封锁了github.com 屏蔽,但 crates.io 不被屏蔽。有没有一个选项可以让 cargo 仍然可以下载它需要的包而不需要更新它的注册表?

4

3 回答 3

16

如果您查看配置 Cargo的文档,您会注意到index该部分中有一个键[registry]。这可以是 Git 存储库的任何路径。

因此,您可以对 crates.io 索引进行本地克隆。我通过像这样克隆它来验证这一点:

git clone --bare https://github.com/rust-lang/crates.io-index.git

然后编辑我的 Cargo 配置(具体来说,我更改了~/.cargo/config,但这应该适用于文档描述的任何地方)以包含:

[registry]
index = "file:///F:/Data/Repositories/crates.io-index.git"

需要注意的几点:

  1. 并不反映包的实际内容。那些来自不同的主机。但是,我不知道如何反映这些:Cargo 在本地缓存它们要好得多。打包应该足够了,cargo fetch然后将缓存的*.crate文件复制到$HOME/.cargo/registry/cache/*.

  2. 这会导致Cargo.lock文件中的包标识符发生更改。这对于开发库来说不是问题,但对于二进制文件来说确实是个问题。标准做法是检查二进制文件的源代码控制,以便下游的每个人都使用完全相同的包版本进行构建。但是,修改后的索引意味着没有其他人能够使用该锁定文件构建包。Cargo.lock

    我通过在二进制包中放置另一个配置覆盖来解决这个问题,将索引重置为“官方”的,但在你的情况下这甚至可能是不可能的。在这种情况下,您可能需要Cargo.lock从源代码管理中排除,或者只是有一个“不使用官方索引”分支。

于 2015-06-24T14:36:55.410 回答
0

Sadly, cargo support --offline and config with net.offline only. This flag add in this PR.

于 2021-02-07T11:22:29.783 回答
0

由于不再支持 registry.index 配置值,我可以替换官方 crates.io 注册表,使用在我的项目中添加这个 .cargo/config 文件(或在 $CARGO_HOME%\.cargo 下):

[source]

[source.mirror]
registry = "http://localhost:8185/auser/crates.io-index.git"

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

也可以使用基于文件的 git 注册表克隆:

registry = "file://c:/github/crates.io-index.git"

使用 git clone --bare 或 --mirror 下载

cargo build 现在打印 Updating 'c:\github\crates.io-index.git' index 而不是Updating crates.io index

于 2021-07-01T06:17:24.253 回答