源替换

这篇文档是关于替换 crate 索引的。你可以在本文档的 overriding dependencies 部分阅读关于覆盖依赖的内容。

是包含可以作为包的依赖项的crate的提供者。 Cargo支持 用一个源替换另一个源的能力 ,从而有以下的策略:

  • 拓展 - 可以自定义源,代表本地文件系统上的crate。这些源是它们所替换源的子集,如果有必要,可以被检查引到包中。

  • 镜像 - 源被替换成一个相等的版本,作为crates.io的缓存。

Cargo有一个关于源替换的核心假设,即两个源的源代码是完全一样的。 请注意,这也意味着替换源不允许有原始源中没有的crate。

因此,源替换并不适合于修补依赖或私有注册中心的情况。 Cargo支持通过使用 [patch]来修补依赖,对私有注册中心的支持在注册中心章节中描述。

当使用源替换时,运行像 cargo publish 这样需要联系注册中心的命令需要通过 --registry 选项。这有助于避免在联系哪个注册中心方面出现歧义,并将使用指定注册中心的认证令牌。

配置

替换源的配置是通过 .cargo/config.toml 完成的,全部可用的键有:

# `source` 表是存储所有与源替换有关的键的位置。
[source]

# 在 `source` 表下有一些其他的表,它们的键是相关来源的名称。
# 例如,这一节定义了一个新的源文件,叫做 `my-vendor-source` ,它来自一个位于 `vendor` 的目录,相对于包含这个 `.cargo/config.toml` 文件的目录而言。
[source.my-vendor-source]
directory = "vendor"

# crates.io的默认源代码以 "crates-io" 的名称提供,这里我们使用 `replace-with` 键来表示它被我们上面的源替换。
#
# `replace-with` 键也可以引用在 `[registries]` 表中定义的其他注册中心名称。
[source.crates-io]
replace-with = "my-vendor-source"

# 每个源都有自己的表,其中键是源的名称。
[source.the-source-name]

# 表示 `the-source-name` 替换为 `another-source` ,定义在其他地方
replace-with = "another-source"

# 可以指定几种源(下文有更详细的描述):
registry = "https://example.com/path/to/index"
local-registry = "path/to/registry"
directory = "path/to/vendor"

# Git源也可以选择指定一个branch/tag/rev
git = "https://example.com/path/to/repo"
# branch = "master"
# tag = "v1.0.1"
# rev = "313f44e8"

注册中心源

"注册中心源" 是与crates.io 相同的。 也就是说,它有一个在git仓库中提供的索引,与 crates.io index 的格式一致。 然后,该仓库表明从哪里下载crates的配置。

目前还没有一个已经可用的项目来建立crates.io的镜像。但请继续关注!

本地注册中心源

"本地注册中心源" 旨在成为另一个注册中心源的子集,但在本地文件系统上可用(又称拓展)。 本地注册中心是提前下载的,通常与 Cargo.lock 同步,并由一组 *.crate 文件和一个索引组成,就像普通注册中心一样。

管理和创建本地注册中心源的主要方式是通过 cargo-local-registry 子命令, crates.io上有,可以用 cargo install cargo-local-registry 来安装。

本地注册中心包含在一个目录中,并包含一些从crates.io下载的 *.crate 文件,以及 index 目录,其格式与 crates.io-index 项目相同 (只填充存在的crates的条目)。

目录源

"目录源" 类似于本地注册中心源,它包含了一些在本地文件系统上可用的crate,适合于拓展依赖。目录源主要由 cargo vendor 子命令管理。

但目录源与本地注册中心不同,它们包含 *.crate 文件的解压版本,在某些情况下更适合将所有东西都检查引入源控制中。 目录源只是一个包含其他一些目录的目录,这些目录包含了crate的源代码(*.crate 文件的解压版本)。目前对每个目录的名称没有限制。

目录源中的每个crate也有一个相关的元数据文件,表明crate中每个文件的校验和,以防止意外的修改。