禁用Cargo中的注册表更新

14

我该如何禁用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可以在不更新其注册表的情况下仍然下载所需的软件包?


8
被公司屏蔽了github.com,这真的很令人沮丧。 - Shepmaster
1
块的性质是什么?DNS、IP? - Chris Morgan
两者都需要。我需要git才能下载crates.io-index!我得回家自己做然后发邮件给自己。 - Delta_Fore
2
@Ronnie:我无法想出他们为什么会屏蔽github.com的解释。他们为什么这样做? - Chris Morgan
1
因为有人曾经上传了一些专有软件,所以他们封锁了整个网站,影响了超过10万名员工。现在我们只能在手机上阅读文档。 - Delta_Fore
3个回答

16
如果您查看配置Cargo的文档,您会注意到[registry]部分中有一个index键。这可以是指向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 排除在源代码控制之外,或者只是拥有一个“不使用官方索引”的分支。


2
或者如果您可以通过IP地址访问GitHub,也许您可以将其更改为https://192.30.252.131/rust-lang/crates.io-index.git。但是,您需要在环境中设置GIT_SSL_NO_VERIFY=true,这是一个不好的主意。或者,您可以参考https://dev59.com/JG865IYBdhLWcg3whO7E#3777141。 - Chris Morgan
"registry.index" 配置值已不再支持。 - user1767316

0

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

[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现在会打印 更新'c:\ github \ crates.io-index.git'索引 而不是更新crates.io索引


0

遗憾的是,货物支持--offline和具有net.offlineconfig

此标志添加在this PR中。


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