#amazon-s3 #fetch #cargo-registry #gc #s3 #cargo-lock

bin+lib cargo-fetcher

🎁 cargo fetch 的替代品

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 日

#127Cargo 插件

Download history 17/week @ 2024-04-22

每月 112 次下载

MIT/Apache

150KB
3.5K SLoC

🎁 cargo-fetcher

Embark Embark Crates.io Docs dependency status Build Status

作为 cargo fetch 的替代品,用于 CI 或其他“干净”环境,您希望快速使用必要的 crate 来编译/测试等。

为什么?

  • 您在干净和/或容器化环境中运行许多 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_IDAWS_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_ACCOUNTSTORAGE_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 就可以在开始构建代码之前不进行任何实际工作。

贡献

Contributor Covenant

我们欢迎社区为此项目做出贡献。

请阅读我们的贡献指南,了解更多关于如何开始的详细信息。

许可证

许可协议为以下之一

任选其一。

贡献

除非您明确表示,否则根据Apache-2.0许可证定义,您有意提交以包含在作品中的任何贡献,应如上双许可,不附加任何额外条款或条件。

依赖项

~36–71MB
~1.5M SLoC