注册表
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
命令行标志来指示要使用的注册表。例如,要发布当前目录中的包
-
cargo login --registry=my-registry
这只需要做一次。您必须输入从注册表网站检索的秘密 API 令牌。或者,令牌可以直接传递给带有
--token
命令行标志的publish
命令,或者使用注册表名称的环境变量,例如CARGO_REGISTRIES_MY_REGISTRY_TOKEN
。 -
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 支持两种远程注册表协议:git
和 sparse
。如果注册表索引 URL 以 sparse+
开头,则 Cargo 使用 sparse 协议。否则 Cargo 使用 git
协议。
git
协议将索引元数据存储在 git 仓库中,并要求 Cargo 克隆整个仓库。
sparse
协议使用纯 HTTP 请求获取单个元数据文件。由于 Cargo 仅下载相关 crate 的元数据,因此 sparse
协议可以节省大量时间和带宽。
crates.io 注册表同时支持这两种协议。crates.io 的协议通过 registries.crates-io.protocol
配置键控制。