注册表

Cargo 从“注册表”安装 crate 并获取依赖项。默认注册表是 crates.io。注册表包含一个“索引”,其中包含可用 crate 的可搜索列表。注册表还可以提供 Web API,以支持直接从 Cargo 发布新的 crate。

注意:如果您有兴趣镜像或 vendor 现有注册表,请查看源替换

如果您正在实现注册表服务器,请参阅运行注册表,了解有关 Cargo 和注册表之间协议的更多详细信息。

如果您正在使用需要身份验证的注册表,请参阅注册表身份验证。如果您正在实现凭据提供程序,请参阅凭据提供程序协议以获取详细信息。

使用备用注册表

要使用 crates.io 以外的注册表,必须将注册表的名称和索引 URL 添加到 .cargo/config.toml 文件中。registries 表格为每个注册表都有一个键,例如

[registries]
my-registry = { index = "https://my-intranet:8080/git/index" }

index 键应该是指向包含注册表索引的 git 仓库的 URL,或者是带有 sparse+ 前缀的 Cargo sparse 注册表 URL。

然后,crate 可以通过在 Cargo.toml 中该依赖项的条目中指定 registry 键和注册表名称的值来依赖于来自另一个注册表的 crate

# Sample Cargo.toml
[package]
name = "my-project"
version = "0.1.0"
edition = "2024"

[dependencies]
other-crate = { version = "1.0", registry = "my-registry" }

与大多数配置值一样,索引可以使用环境变量而不是配置文件来指定。例如,设置以下环境变量将达到与定义配置文件相同的效果

CARGO_REGISTRIES_MY_REGISTRY_INDEX=https://my-intranet:8080/git/index

注意:crates.io 不接受依赖于来自其他注册表的 crate 的包。

发布到备用注册表

如果注册表支持 Web API 访问,则可以从 Cargo 将包直接发布到注册表。Cargo 的几个命令(例如 cargo publish)接受 --registry 命令行标志来指示要使用的注册表。例如,要发布当前目录中的包

  1. cargo login --registry=my-registry

    这只需要做一次。您必须输入从注册表网站检索的秘密 API 令牌。或者,令牌可以直接传递给带有 --token 命令行标志的 publish 命令,或者使用注册表名称的环境变量,例如 CARGO_REGISTRIES_MY_REGISTRY_TOKEN

  2. cargo publish --registry=my-registry

不必总是传递 --registry 命令行选项,可以在 .cargo/config.toml 中使用 registry.default 键设置默认注册表。例如

[registry]
default = "my-registry"

Cargo.toml 清单中设置 package.publish 键会限制包可以发布到哪些注册表。这对于防止意外地将闭源包发布到 crates.io 非常有用。该值可以是注册表名称的列表,例如

[package]
# ...
publish = ["my-registry"]

publish 值也可以是 false 以限制所有发布,这与空列表相同。

cargo login 保存的身份验证信息存储在 Cargo 主目录(默认为 $HOME/.cargo)中的 credentials.toml 文件中。它为每个注册表都有一个单独的表格,例如

[registries.my-registry]
token = "854DvwSlUwEHtIo3kWy6x7UCPKHfzCmy"

注册表协议

Cargo 支持两种远程注册表协议:gitsparse。如果注册表索引 URL 以 sparse+ 开头,则 Cargo 使用 sparse 协议。否则 Cargo 使用 git 协议。

git 协议将索引元数据存储在 git 仓库中,并要求 Cargo 克隆整个仓库。

sparse 协议使用纯 HTTP 请求获取单个元数据文件。由于 Cargo 仅下载相关 crate 的元数据,因此 sparse 协议可以节省大量时间和带宽。

crates.io 注册表同时支持这两种协议。crates.io 的协议通过 registries.crates-io.protocol 配置键控制。