ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Google APIs 仓库贡献指南:从 CLA 签署到本地生成多语言客户端库源码

Google APIs 仓库贡献指南:从 CLA 签署到本地生成多语言客户端库源码 Google APIs 仓库贡献指南从 CLA 签署到本地生成多语言客户端库源码【免费下载链接】googleapisPublic interface definitions of Google APIs.项目地址: https://gitcode.com/GitHub_Trending/go/googleapisgoogleapis 仓库承载着 Google 全部公开 API 的原始接口定义.proto 文件是跨 REST 与 gRPC 双协议发布接口的唯一事实来源。本文基于仓库根目录的 CONTRIBUTING.md 展开系统讲解外部贡献者加入该项目所需满足的法律要求、必备工具链Protocol Buffers 与 gRPC、本地编译与代码生成流程并结合仓库中的 Makefile、WORKSPACE 与 repository_rules.bzl 等源码级细节帮助你真正理解修改接口定义 → 校验 proto 语法 → 生成各语言客户端库源码的完整链路。读完本文你将能够独立完成贡献前的环境准备、签署 CLA并用一条make命令为 C、Java、Python 等语言批量生成客户端库源码。一、贡献前必须理解这个仓库的产出物是什么在动手修改任何文件之前先明确 googleapis 仓库的定位它只包含接口定义与相关配置文件不包含任何编译好的可链接客户端库。目录层级直接映射 Google API 产品结构与版本例如google/cloud/storage/v2/对应 Cloud Storage 的 v2 接口proto 包名与目录完全一致这一设计保证了生成出的客户端库在各语言中拥有符合习惯的命名空间详见 README.md 的 Repository Structure 一节。这意味着贡献者的工作对象是.proto接口定义、BUILD.bazel构建文件与*_gapic.yaml、*_grpc_service_config.json等服务配置而验证贡献正确性的手段就是能否顺利用工具链编译这些定义并生成出可用的客户端库源码。CONTRIBUTING.md 正是围绕这一流程展开的。二、法律要求签署 Contributor License AgreementCLA所有向 Google 开源项目提交代码的贡献者都必须先签署 Contributor License Agreement。这是保护贡献者本人与 Google 双方权益的法律前提它明确了贡献代码的版权归属与授权范围只有 CLA 状态为已签署时Google 的自动化系统才会接受你的 Pull Request 进入评审流程个人贡献者与代表公司/组织贡献Corporate CLA签署的协议类型不同请按实际身份选择。这一步属于流程性要求与具体技术无关但遗漏签署是新手 PR 被自动拒绝的最常见原因建议在提交第一个 PR 之前就完成。三、技术要求的核心Protocol Buffers gRPCCONTRIBUTING.md 明确指出要在这个仓库工作最低限度需要同时安装 Protocol Buffers 与 gRPC因为二者是编译 proto 定义、生成各语言客户端库源码的基础工具。3.1 为什么缺一不可仓库中的每个服务接口如 google/example/library/v1/library.proto都同时声明了两层信息消息结构与服务接口由 proto3 语法定义需要protocProtocol Buffers 编译器解析HTTP 映射与 gRPC 元数据例如option (google.api.http)注解定义 REST 路由post: /v1/shelves、google.api.method_signature定义便捷方法签名这些注解依赖google/api/*.proto公共定义而 gRPC 插件负责从服务定义生成各语言的 Stub/Client 骨架。因此只用protoc只能产出纯消息类PB代码只有配合 gRPC 插件grpc_语言_plugin才能产出完整的 RPC 客户端源码。3.2 本仓库实际的工具链版本约束从 WORKSPACE 可以看到仓库当前构建所依赖的核心组件版本以文件内实际声明为准组件版本用途Protobuf33.2Java 场景另有 33.6 的com_google_protobuf_java_onlyproto 编译与各语言代码生成gRPC1.78.1gRPC 代码生成插件与运行时依赖Bazel工作区自带 rules_go 0.49.0、rules_python 1.6.0 等多语言构建编排这些版本通过 generator-versions.json 统一管理记录各语言 GAPIC 生成器的 version/commit/sha并由 load_json.bzl 将 JSON 读取为 Starlark 变量供 WORKSPACE 引用。贡献者在本地安装 protoc/gRPC 时建议优先使用与仓库版本兼容的版本避免因语法特性差异导致编译失败。四、编译与生成深入 Makefile 的每一个参数CONTRIBUTING.md 提到的根目录 Makefile 只能生成客户端库源码其实现就在 Makefile。该文件头部注释给出了标准用法make OUTPUT./output LANGUAGEjava4.1 五个可配置变量变量默认值含义OUTPUT./gens生成源码的输出目录LANGUAGEcpp目标语言如java、python、ruby等GRPCPLUGIN/usr/local/bin/grpc_$(LANGUAGE)_plugingRPC 代码生成插件的路径PROTOINCLUDE/usr/local/includeproto 的 include 搜索目录通常包含 protobuf 自带的标准 protoPROTOCprotocprotoc 编译器可执行文件要求已在PATH中4.2 核心编译逻辑逐行拆解FLAGS --proto_path.:$(PROTOINCLUDE) FLAGS --$(LANGUAGE)_out$(OUTPUT) --grpc_out$(OUTPUT) FLAGS --pluginprotoc-gen-grpc$(GRPCPLUGIN)--proto_pathproto 的导入搜索路径。仓库根目录.排在最前保证google/api/annotations.proto这类仓库内相对导入可被解析随后追加$(PROTOINCLUDE)用于解析 protobuf 官方标准库如google/protobuf/empty.proto--语言_out与--grpc_out分别指定 PB 代码与 gRPC 代码的输出目录均指向$(OUTPUT)--pluginprotoc-gen-grpc...显式指定 gRPC 插件protoc 据此为服务定义生成 RPC 客户端骨架。依赖收集则通过 shell 通配完成DEPS: $(shell find google $(PROTOINCLUDE)/google/protobuf -type f -name *.proto | sed s/proto$$/$(SUFFIX)/)它递归收集google/目录下以及 protobuf 标准库 include 目录下的全部.proto文件将后缀替换为pb.cc作为目标名然后用模式规则逐一编译%.$(SUFFIX): %.proto mkdir -p $(OUTPUT) $(PROTOC) $(FLAGS) $*.proto注意SUFFIX默认固定为pb.cc这是仓库当前实现的一个细节——对非 C 语言它仅用于依赖跟踪真正决定输出语言的仍是LANGUAGE变量。4.3 完整的实际操作流程步骤 1安装依赖# 以 Ubuntu/Debian 为例示意 sudo apt-get install -y protobuf-compiler # 并按需安装 gRPC 的 grpc_语言_plugin 插件 # 安装后验证 protoc --version步骤 2确认插件路径Makefile 默认假设插件位于/usr/local/bin/grpc_$(LANGUAGE)_plugin。若你的插件安装在其他位置通过变量覆盖即可make LANGUAGEpython GRPCPLUGIN/opt/grpc/bin/grpc_python_plugin步骤 3生成全部源码make LANGUAGEpython OUTPUT./gens/python all步骤 4清理生成物make cleanclean目标会删除所有生成的pb.cc对应文件并移除输出目录对应实现见 Makefile 的clean段。4.4 重要限制必须知晓CONTRIBUTING.md 强调该 Makefile只生成源码不生成开箱即用的可链接客户端库。两条明确的边界Go 语言不可用ifeq ($(LANGUAGE),go)分支会直接报错退出原因是 Go 的目录结构与仓库的 proto 目录布局不同Go 客户端库源码需要到 go-genproto 仓库获取生成的是半成品产出源码需要你自行纳入项目的构建系统如 Gradle、setuptools 等才能编译成库。若需要现成客户端库应改用下文介绍的 Bazel 方式或使用各语言官方发布渠道。五、生成源码之后开发环境与构建配置CONTRIBUTING.md 提醒将生成的代码编译成可用客户端库需要合适的开发环境与正确的构建配置。结合仓库现状这部分可落地为两条路径路径 A以 Makefile 产物为输入接入你自己的构建系统。例如把gens/python目录加入 Python 包的packages配置或把 Java 生成源码加入 Gradle 的sourceSets。这种做法灵活但需自行维护构建脚本。路径 B使用 Bazel 直接产出可发布包仓库官方推荐。README.md 明确推荐 Bazel 4.2.2作为构建方式且仓库为 Java、Go、Python、Ruby、Node.js、PHP、C# 都准备好了 Bazel 包。例如 google/example/library/v1/BUILD.bazel 中定义了java_gapic_library、go_gapic_library、py_gapic_library等规则并配套*_gapic_assembly_pkg规则产出可发布的软件包如google-cloud-example-library-v1-java、example-library-v1-py。# 构建某个 API 的所有语言库 bazel build //google/example/library/v1/... # 构建某个 API 的 Java 包 bazel build //google/example/library/v1:google-cloud-example-library-v1-java # 全量测试 bazel test //...5.1 语言规则是如何被按需开关的为什么同一个 BUILD 文件里所有语言的规则都能共存、且构建时只启用你需要的语言答案在 repository_rules.bzl 的switched_rules_by_language宏中。WORKSPACE 通过一次调用为全部语言开启规则switched_rules_by_language( name com_google_googleapis_imports, cc True, csharp True, gapic True, go True, go_test True, grpc True, java True, nodejs True, php True, python True, ruby True, )该宏为每种语言生成一组开关如java_gapic_library需java and grpc and gapic同时为真才加载真实实现未启用的规则被替换为 no-op 空实现见_switch与_switched_rules_impl的实现逻辑。这就是仓库定义齐全、按需启用构建模型的底层原理。5.2 语言相关的版本管理各语言的 GAPIC 生成器版本统一记录在 generator-versions.jsonWORKSPACE 中按语言读取其version/commit/sha并以此锁定下载的生成器版本Go 生成器 0.54.0、Java 2.75.0、Python 1.37.0 等以该文件实际内容为准。因此贡献者若想验证某个 API 的新生成效果无需手动下载生成器直接依赖 Bazel 的版本解析即可。六、贡献流程小结与自检清单结合全文一次规范的贡献流程如下签署 CLA个人或公司主体安装工具链Protocol Buffers、gRPC含对应语言插件如用 Bazel 方式则安装 Bazel 4.2.2修改 proto 定义或配置如google/api/*.proto、某个 API 的.proto与 YAML/JSON 配置本地验证快速校验make LANGUAGE语言 OUTPUT./gens all确认语法与生成可通过深度校验bazel build //...与bazel test //...验证全仓库多语言构建与测试提交 PR等待评审与 CLA 校验。自检要点生成的源码是否与预期语言一致检查--语言_outGo 相关改动是否绕开了根 Makefile 的限制Go 源码请走 go-genproto 渠道修改公共定义如 google/api/annotations.proto时是否影响了其他 API 的构建务必跑全量bazel test //...。七、总结CONTRIBUTING.md 篇幅虽短却精确概括了 googleapis 仓库的协作模型这是一个以 proto 接口定义为中心的定义即代码仓库贡献者需要同时掌握 Protocol Buffers 与 gRPC 工具链理解 Makefile 的生成源码与 Bazel 的产出可发布库两层构建能力并接受 Go 语言需走专门渠道的事实。掌握这些要点后无论是修正一个注解、新增一个 RPC 方法还是引入全新的 API 目录你都能在本地完成可复现的验证让你的 PR 顺利进入 Google API 的发布管线。【免费下载链接】googleapisPublic interface definitions of Google APIs.项目地址: https://gitcode.com/GitHub_Trending/go/googleapis创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表