26 个版本 (13 个重大更新)
0.14.6 | 2023 年 8 月 23 日 |
---|---|
0.13.1 | 2023 年 1 月 10 日 |
0.13.0 | 2022 年 5 月 25 日 |
0.12.1 | 2022 年 2 月 28 日 |
0.5.1 | 2019 年 7 月 27 日 |
#127 在 Cargo 插件
每月 112 次下载
150KB
3.5K SLoC
为什么?
- 您在干净和/或容器化环境中运行许多 CI 任务,并希望快速获取 cargo 注册表和 crate,以便可以将计算资源用于实际的编译和测试代码,而不是下载依赖项。
为什么不呢?
- 除了
fs
存储后端外,唯一支持的存储后端是 3 个主要的云存储后端,因为将 crate 和注册表信息存储在运行 CI 任务的同一云中通常是有益的,以利用局部性和 I/O 吞吐量。 cargo-fetcher
不应在典型的用户环境中使用,因为它完全忽略了 cargo 中内置的各种安全机制,例如基于文件的锁定。cargo-fetcher
假设它运行在一个具有高网络吞吐量和低延迟的环境。
支持的存储后端
gcs
gcs
功能启用使用 Google Cloud Storage 作为后端。
- 必须为
-u | --url
参数提供一个 URL,使用 gsutil 语法,形式如下gs://<bucket_name>(/<prefix>)?
- 必须通过
--credentials
或通过环境变量GOOGLE_APPLICATION_CREDENTIALS
提供用于 GCP 服务帐户 的凭据
s3
s3
功能允许使用 Amazon S3 作为后端。
- 必须为
-u | --url
参数提供一个 URL,其形式必须如下http(s)?://<bucket>.s3(-<region>).<host>(/<prefix>)?
- 必须通过环境变量
AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
提供的 AWS IAM 用户,这些变量在 此处 描述,或从具有假定角色的 EC2 实例运行,这些角色在 此处 描述。
fs
fs
功能允许使用本地磁盘上的文件夹来存储和检索 crates。
- 必须为
-u | --url
参数提供一个 URL,使用file:
机制
blob
blob
功能允许使用 Azure Blob 存储 作为后端。
- 必须为
-u | --url
参数提供一个 URL,其形式必须如下blob://<container_name>(/<prefix>)?
- 必须通过环境变量
STORAGE_ACCOUNT
和STORAGE_MASTER_KEY
提供的 Azure 存储帐户,这些变量在 此处 描述。
示例
这是一个来自我们 CI 的内部项目的示例。
依赖项
- 424 个 crates.io crates:缓存的 - 38MB,解包的 - 214MB
- 13 个来自 10 个 Git 仓库的 crates 源:数据库 - 27MB,检出 - 38MB
场景
以下 CI 作业并行运行,每个作业都在 GKE 上运行的 Kubernetes 作业中运行。容器基础与官方 rust:1.39.0-slim 镜像大致相同。
- 构建 WASM 模块
- 构建本地模块
- 构建本地主机客户端
~ 等待所有作业完成 ~
- 从主机客户端运行 WASM 和本地模块的测试
之前
所有 3 个构建作业每个大约需要 1m2s 来执行 cargo fetch --target x86_64-unknown-linux-gnu
之后
所有3个构建任务每个都需要 3-4秒 来执行 cargo fetcher --include-index sync
。
用法
cargo-fetcher
只有 2 个子命令。它们都共享一组选项,每个后端的重要输入在 存储后端 中描述。
除了后端的具体信息外,唯一必需的可选参数是你正在操作 Cargo.lock
锁文件的路径。 cargo-fetcher
需要一个锁文件,否则,生成锁文件的正常 cargo 工作需要本地有一个完整的索引库,这部分抵消了此工具的意义。
-l, --lock-file <lock-file>
Path to the lockfile used for determining what crates to operate on [default: Cargo.lock]
mirror
mirror
子命令负责从原始位置下载 crate 和索引库,并将它们重新上传到你的存储后端。
它还有一个附加选项,用于确定它应该多频繁地拍摄索引库的快照。
-m, --max-stale <max-stale>
The duration for which the index will not be replaced after its most recent update.
Times may be specified with no suffix (default days), or one of:
* (s)econds
* (m)inutes
* (h)ours
* (d)ays
自定义仓库
镜像的一个问题是自定义仓库的存在。为了处理这些问题,cargo fetcher
使用与 cargo 相同的逻辑来定位 .cargo/config<.toml>
配置文件来检测自定义仓库,但是,cargo 的配置文件仅包含从仓库获取和发布所需的数据,而下载 crate 的 URL 模板实际上位于仓库根目录下的 config.json
文件中。
而不是等待下载仓库索引,然后再获取该仓库的任何 crate,cargo-fetcher
允许您通过环境变量自行指定下载位置,这样它就可以完全并行化索引库和 crate 的获取。
示例
# .cargo/config.toml
[registries]
embark = { index = "<secret url>" }
环境变量形式为 CARGO_FETCHER_<name>_DL
,其中 name 是配置文件中仓库的同名(大写)名称。
CARGO_FETCHER_EMBARK_DL="https://secret/rust/cargo/{crate}-{version}.crate" cargo fetcher mirror
URL 的 格式 应与您的仓库 config.json
文件中的格式相同。如果未指定您的仓库,则默认的 /{crate}/{version}/download
将附加到仓库的 URL 上。
sync
sync
子命令实际上是 cargo fetch
的替代品,但它不是从常规位置下载 crate 和注册表,而是从您的存储后端下载,并以与 cargo 相同的方式将它们分散到磁盘上,这样 cargo 就可以在开始构建代码之前不进行任何实际工作。
贡献
我们欢迎社区为此项目做出贡献。
请阅读我们的贡献指南,了解更多关于如何开始的详细信息。
许可证
许可协议为以下之一
- Apache许可证2.0版(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT或http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确表示,否则根据Apache-2.0许可证定义,您有意提交以包含在作品中的任何贡献,应如上双许可,不附加任何额外条款或条件。
依赖项
~36–71MB
~1.5M SLoC