28 个版本

0.1.8 2024年8月16日
0.1.7 2024年7月30日
0.1.5 2024年6月27日
0.1.2 2024年2月12日
0.0.18 2022年5月31日

#56开发工具

Download history 1156/week @ 2024-05-03 1133/week @ 2024-05-10 1077/week @ 2024-05-17 1128/week @ 2024-05-24 881/week @ 2024-05-31 1196/week @ 2024-06-07 1715/week @ 2024-06-14 855/week @ 2024-06-21 1341/week @ 2024-06-28 1320/week @ 2024-07-05 1302/week @ 2024-07-12 2226/week @ 2024-07-19 5472/week @ 2024-07-26 5840/week @ 2024-08-02 3698/week @ 2024-08-09 3834/week @ 2024-08-16

19,726 每月下载量

Apache-2.0

230KB
3.5K SLoC

Protofetch

CI Apache 2 License License Crates.io npm version GitHub Stars

Protobuf 文件的源依赖管理工具。

动机

如果你广泛使用 protobuf 作为服务之间通信的数据格式,或者用于与外部世界共享你的 API,你需要一种方式来获取每个服务的正确版本的 protobuf 文件,并能够依赖于特定版本。这既需要在服务器端,也需要在客户端。没有自动化,这很快就会变得繁琐、易出错,并且总体上难以管理。

为了使其变得可忍受、可用且稳定,需要工具来自动化这项工作并使其可预测。这正是 Protofetch 所追求的。

为什么选择 Protofetch?

Protofetch 致力于以声明式方式处理 protobuf 依赖的复杂性。它使得声明依赖关系和管理它们变得非常简单。

它为你提供了以下能力:

  • 依赖特定版本/哈希;
  • 依赖于 protobuf 的可预测的构建/测试/CI;
  • 易于阅读的 protobuf 依赖的声明性规范;
  • 自动化获取依赖及其传递依赖;
  • 缓存依赖,以便在多个项目中共享。

路线图

此项目仍在开发中,未来可能会有所变化。我们希望在发布第一个稳定版本之前实现以下目标。

  • 根据 git 标签或分支获取依赖;
  • 通过修订版本地缓存依赖;
  • 获取传递依赖;
  • 每个依赖的声明性规则;
    • 允许策略;
    • 拒绝策略;
    • 依赖剪枝(删除不需要的 proto 文件);
  • 防止循环依赖;

入门

您可以从 GitHub 发布页面 下载预构建的二进制文件。

Protofetch 也已发布到 crates.io,因此如果您已安装 Rust 工具链,则可以使用以下命令从源代码构建 Protofetch:cargo install protofetch

使用方法

# Fetch proto sources, updating the lock file if needed.
protofetch fetch
   
# Verify the lock file, and fetch proto sources. Useful for CI.
protofetch fetch --locked

Protofetch 模块

使用 protofetch 的每个服务都需要一个模块描述符,该描述符使用 toml 格式。此描述符默认称为 protofetch.toml,位于服务存储库的根目录。这可以更改,但强烈不建议更改。

字段 类型 必需 描述
name 字符串 必需 定义模块的名称
description 字符串 可选 模块的描述
dependencies [依赖项] 可选 要获取的依赖项

依赖项格式

字段 类型 必需 描述 示例
url 字符串 必需 从检查 protobuf 文件的存储库地址 "github.com/coralogix/cx-api-users/"
revision 字符串 可选 要检查的修订版本,可以是标记版本或提交哈希 v0.2
branch 布尔值 可选 要检查的分支,获取最新提交 feature/v2
protocol 字符串 可选 要使用的协议:[ssh, https] ssh
allow_policies [字符串] 可选 允许策略规则 "/prefix/*", "/subpath/*", "/path/to/file.proto"
deny_policies [字符串] 可选 拒绝策略规则 "/prefix/*", "/subpath/*", "/path/to/file.proto"
prune bool 可选 是否修剪不必要的传递依赖 proto 文件 true /false
transitive bool 可选 将此依赖项标记为传递依赖 true /false

Protofetch 依赖项 toml 示例

name = "repository name"
description = "this is a repository"

[dep1]
url = "github.com/org/dep1"
protocol = "https"
revision = "1.3.0"
prune = true
allow_policies = ["/prefix/*", "*/subpath/*", "/path/to/file.proto"]

[dep2]
url = "github.com/org/dep2"
protocol = "ssh"
branch = "feature/v2"

[another-name]
protocol = "ssh"
url = "github.com/org/dep3"
revision = "a16f097eab6e64f2b711fd4b977e610791376223"
transitive = true

Git 协议

Protofetch 支持使用 sshhttps 访问 Git 存储库。默认情况下,Protofetch 使用 ssh。您可以使用环境变量 PROTOFETCH_GIT_PROTOCOL 配置默认 Git 协议。

您也可以在 protofetch.toml 中设置协议,但仅在 Git 服务器不支持两种协议的情况下才需要这样做。否则,最好留空此字段,让用户选择他们想要的任何协议。

SSH 支持

您需要一个运行的 SSH 代理,并加载了您的 SSH 密钥

ssh-add ~/.ssh/your-private-key

HTTPS 支持

如果您想使用 https,则需要配置 git 使用 credentials helper

要支持启用 2FA 时的 https,您必须生成一个个人访问令牌并将其设置为密码。在创建令牌时,以下权限是足够的。

GitHub personal access token

传递依赖项支持和修剪

Protofetch 支持方便地拉取传递依赖项。但是,如果依赖项没有定义自己的 protofetch 模块,则需要一些手动工作。

在 A 依赖于 B 的情况下,您应该将此依赖项标记为传递依赖。

这特别有用,尤其是当您利用修剪功能,这允许您仅递归地获取您实际需要的 proto 文件。启用修剪后,protofetch 将递归地找到您的根 proto 依赖的哪些 proto 文件,并获取它们,只要它们被导入(标记为传递依赖项或从其他模块获取)。

此外,您还可以使用 allow_policies 限制从依赖项获取的根 proto 文件。例如,以下模块仅依赖于 A 的文件 /proto/path/example.proto,但由于修剪已启用且 B 已标记为传递依赖,如果允许的文件有任何文件依赖项,它将递归地拉取它们及其依赖项。

重要:如果您使用 prune 功能,也必须使用 transitive 功能。但是,除非您确实需要拉取传递依赖,否则请勿使用 transitive。这是针对没有在其仓库上定义 protofetch 文件的依赖项的解决方案。

name = "repository name"
description = "this is a repository"
proto_out_dir = "proto/src/dir/output"

[A]
protocol = "https"
url = "github.com/org/A"
revision = "1.3.0"
allow_policies = ["/proto/path/example.proto"]
prune = true

[B]
protocol = "ssh"
url = "github.com/org/B"
revision = "5.2.0"
transitive = true

依赖项

~15–26MB
~475K SLoC