源代码替换

本文档介绍如何替换软件包索引。您可以在本文档的覆盖依赖项部分阅读有关覆盖依赖项的信息。

源代码是包含可作为包依赖项的软件包的提供程序。Cargo 支持**用一个源代码替换另一个源代码**的功能,以表达以下策略:

  • 供应商 - 可以定义自定义源代码,这些源代码表示本地文件系统上的软件包。这些源代码是它们所替换的源代码的子集,如果需要,可以将其签入包中。

  • 镜像 - 可以将源代码替换为等效版本,该版本充当 crates.io 本身的缓存。

Cargo 对源代码替换有一个核心假设,即两个源代码的源代码完全相同。请注意,这也意味着替换源代码不允许包含原始源代码中不存在的软件包。

因此,源代码替换不适用于修补依赖项或私有注册源等情况。Cargo 支持通过使用[patch]来修补依赖项,私有注册源支持在注册源章节中进行了描述。

使用源代码替换时,运行需要联系注册源的命令(如 cargo publish)需要传递 --registry 选项。这有助于避免关于要联系哪个注册源的任何歧义,并将使用指定注册源的身份验证令牌。

配置

替换源代码的配置是通过.cargo/config.toml完成的,所有可用键如下:

# The `source` table is where all keys related to source-replacement
# are stored.
[source]

# Under the `source` table are a number of other tables whose keys are a
# name for the relevant source. For example this section defines a new
# source, called `my-vendor-source`, which comes from a directory
# located at `vendor` relative to the directory containing this `.cargo/config.toml`
# file
[source.my-vendor-source]
directory = "vendor"

# The crates.io default source for crates is available under the name
# "crates-io", and here we use the `replace-with` key to indicate that it's
# replaced with our source above.
#
# The `replace-with` key can also reference an alternative registry name
# defined in the `[registries]` table.
[source.crates-io]
replace-with = "my-vendor-source"

# Each source has its own table where the key is the name of the source
[source.the-source-name]

# Indicate that `the-source-name` will be replaced with `another-source`,
# defined elsewhere
replace-with = "another-source"

# Several kinds of sources can be specified (described in more detail below):
registry = "https://example.com/path/to/index"
local-registry = "path/to/registry"
directory = "path/to/vendor"

# Git sources can optionally specify a branch/tag/rev as well
git = "https://example.com/path/to/repo"
# branch = "master"
# tag = "v1.0.1"
# rev = "313f44e8"

注册源

“注册源”是指与 crates.io 本身相同的源代码。也就是说,它有一个在 git 存储库中提供的索引,该索引与crates.io 索引的格式相匹配。然后,该存储库具有指示从何处下载软件包的配置。

目前还没有一个现成的项目可以用来设置 crates.io 的镜像。不过请继续关注!

本地注册源

“本地注册源”旨在成为另一个注册源的子集,但可在本地文件系统上使用(也称为供应商)。本地注册源会提前下载,通常与 Cargo.lock 同步,并由一组 *.crate 文件和一个类似于普通注册源的索引组成。

管理和创建本地注册源的主要方法是通过cargo-local-registry子命令,该子命令可在 crates.io 上获得,可以使用 cargo install cargo-local-registry 进行安装。

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

目录源代码

“目录源代码”类似于本地注册源,它包含本地文件系统上可用的多个软件包,适用于供应商依赖项。目录源代码主要由 cargo vendor 子命令管理。

目录源代码与本地注册源的不同之处在于,它们包含 *.crate 文件的解压缩版本,这使得在某些情况下更适合将所有内容都签入源代码控制中。目录源代码只是一个目录,其中包含许多其他目录,这些目录包含软件包的源代码(*.crate 文件的解压缩版本)。目前对每个目录的名称没有限制。

目录源代码中的每个软件包还有一个关联的元数据文件,该文件指示软件包中每个文件的校验和,以防止意外修改。