注册中心

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

注意:如果您对镜像或 vendoring 现有注册中心感兴趣,请查看 源替换

如果您正在实现注册中心服务器,请参阅 运行注册中心 以获取有关 Cargo 与注册中心之间协议的更多详细信息。

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

使用备用注册中心

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

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

index 键应该是一个指向包含注册中心索引的 git 仓库的 URL,或者是一个带有 sparse+ 前缀的 Cargo 稀疏注册中心 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。另外,也可以使用 --token 命令行标志直接将 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 配置键控制。