资讯详情

资讯详情

Protocol Buffers 贡献指南:编写可被合并进 protobuf 主仓库的 Pull Request 全解

Protocol Buffers 贡献指南编写可被合并进 protobuf 主仓库的 Pull Request 全解【免费下载链接】protobufProtocol Buffers - Googles data interchange format项目地址: https://gitcode.com/GitHub_Trending/pr/protobuf本文基于 protobuf 仓库根目录的 CONTRIBUTING.md 展开系统讲解 Protocol Buffers 项目对贡献类型的取舍标准、 CLA 与编码风格前置要求、从 main 分支到版本发布分支的完整贡献流程以及 Pull Request 与 Reviewer 的双方准则。读完本文你将知道什么样的补丁会被接受、什么样的改动会被直接拒绝并能按照项目规范准备出一个描述清晰、测试通过、提交历史整洁、可进入发布流程的 PR。一、项目会接受哪些类型的贡献CONTRIBUTING.md 开宗明义We welcome some types of contributions——项目欢迎的是特定类型的贡献而非所有改动。原文档给出了五类贡献的明确接受/拒绝边界这也是 protobuf 作为 Google 长期维护的基础设施库在稳定性优先理念下的直接体现。1. Bug 修复必须附带单元测试附带能复现问题的单元测试的 Bug 修复非常受欢迎即使不带补丁的 Bug 报告也值得提交。没有测试的 Bug 修复通常不会被接受Bug fixes without tests are usually not accepted。从仓库结构看protobuf 每个语言实现都配有大量测试目录例如 src/BUILD.bazel 之下数百个测试目标、csharp/src/Google.Protobuf.Test、python/google、rust/test 等修复必须带测试的门槛与这套测试基础设施是直接对应的。2. 新 API 与新特性有较高的有用性门槛满足测试覆盖充分、文档完备、且不损害向后兼容性的前提下新 API 可能被接受。但原文档特别强调一个新的公开方法必须跨过**相当高的有用性门槛**才会被接受一个特性即使单独看没问题也可能因为影响力不足以证明其带来的概念负担和长期维护成本而被拒绝最佳实践是先提 issue与维护者就新特性的价值达成一致再动手写 PR。3. 性能优化必须有可信的 benchmark性能优化只有在同时满足以下条件时才可能被接受附带有说服力的基准测试benchmarks证明确有提升不显著增加代码复杂度。仓库中 benchmarks/ 目录正是为此而建benchmarks/BUILD 通过cc_proto_library、upb_c_proto_library、upb_minitable_proto_library等规则为同一份descriptor.proto生成多套实现C 经典实现与 upb 各变体并构建基准二进制benchmarks/benchmark.cc、benchmarks/compare.py 与 benchmarks/gen_synthetic_protos.py 提供了生成合成 proto、批量对比不同实现性能的完整工具链。提交性能 PR 时参照这套设施产出对比数据就是原文档所说的有说服力的 benchmark。4. 修改现有 API几乎从不接受对现有 API 的修改几乎从不被接受。稳定性和向后兼容是最高原则。即使在极罕见的情况下确需破坏性变更该变更通常必须先落地于 Google 内部代码库google3验证后再同步到开源仓库。仓库中 compatibility/smoke/ 目录直观体现了这种旧代码 × 新运行时的兼容性承诺compatibility/smoke/README.md 说明该目录针对最新运行时运行由旧版 protoc 生成的代码的核心功能其中 compatibility/smoke/BUILD.bazel 下按版本组织了 v3.0.0、v3.8.0、v3.11.0、v3.19.0、v3.20.0、v21.12、v25.8、v26.0、v32.1 等多个历史版本生成代码的烟雾测试。这也解释了为什么对公开 API 的任何破坏都几乎不可能被接受。5. 修改 wire / text 格式永不接受对线格式wire format和文本格式的修改永远不被接受。任何破坏性变更必须以全新格式的形式出现——因为项目绝不能开始生成旧代码无法解析的 proto。这条红线同样是 compatibility/smoke/ 存在的前提只要 wire 格式不变旧生成代码才能永远被新运行时读取。二、开始贡献之前CLA 与编码风格Contributor License Agreements贡献者许可协议对项目的贡献必须伴随 CLA。签署 CLA 后你或你的雇主保留贡献内容的版权协议只是授予项目使用并再分发你的贡献的许可。分两种情况个人贡献如果你是以个人身份编写原创代码、且确信自己拥有该知识产权需要签署个人 CLAIndividual CLA签署入口为 Google 的 CLA 服务 cla.developers.google.com公司贡献如果你在允许员工对外贡献的公司任职需要签署公司 CLACorporate CLA同一入口。编码风格遵循 Google 编码规范本项目遵循Google 编码风格指南Googles Coding Style Guides见 google/styleguide 项目。原文档要求在发出 PR 之前先熟悉对应语言的风格指南确保拟议的代码变更在风格上合规。仓库中可以看到风格约束的实际落点根目录.clang-format定义了 C 代码的格式化规则objectivec/.clang-format 单独为 Objective-C 层配置了格式化规则ci/ 目录则提供了 CI 侧的构建与测试配置下文测试章节再展开。提交前建议至少用与.clang-format一致的格式化工具跑一遍 C 改动。三、贡献流程Contributing Process3.1 目标分支与版本节奏大多数 PR 应提交到 main 分支变更将进入下一个 major/minor 版本例如 3.6.0 这样的版本。如果需要让某个 Bug 修复进入补丁版本例如 3.5.2流程是确认该修复已合入 main再创建一个 PR把 main 上对应的 commitcherry-pick 到发布分支例如3.5.x分支。仓库根目录的 version.json 揭示了当前 main 分支的版本形态protoc_version为37-dev各语言运行时版本号cpp7.37-dev、java4.37-dev、python7.37-dev、csharp3.37-dev、objectivec5.37-dev、php5.37-dev、ruby4.37-dev、rust0.37-dev等均带-dev后缀即开发中的下一版本。可见 main 分支始终指向下一个 minor 版本与原文档描述的节奏一致。发布打包时protobuf_version.bzl 提供PROTOC_VERSIONprotobuf_release.bzl 再基于它与当前 C 工具链推导目标平台linux-x86_64 / win64 / osx-aarch_64 等生成发布包命名合入 main 的变更最终经由这条链路进入正式发行版。3.2 评审节奏与响应约定每个 PR 会被指派一名 protobuf 团队成员负责评审小的清理类变更可能在初评后直接合并较大的变更通常会经历多轮评论耗时会相应拉长项目承诺尽量在7 天内给出响应如果几天内没有回音可以主动在评论线程里 提醒贡献者同样被期望在合理时间内回复评审意见若贡献者 2 周以上无响应PR 可能会被关闭——之后仍可以在有空时重新提交。PR 一旦合并后续把它带进最终发布的工作由项目团队负责。四、Pull Request 指南逐条解读原文档列出的 PR 规范可归纳为 10 条硬约束逐条说明其意图与操作要点Google 内部员工优先走内部 CL如果是 Googler建议先创建内部 CL 完成评审与提交代码传播流程会自动把变更同步到 GitHub 仓库避免内外两份评审。文档变更走独立仓库文档类 PR 应提交到protocolbuffers/protocolbuffers.github.io仓库。当前项目没有文档的内嵌摄取流程但团队会在接受文档变更后数周内把改动同步回内部并发布到官方文档站。PR 要小、要聚焦单一问题项目经常收到一个 PR 修好几件事的提交但如果其中只有一个修复被认为可接受整个 PR 都无法合并作者和评审双方都浪费了大量时间。正确做法是为不同关注点分别开 PR。探索性改动先开 issue 讨论如果提议的是行为或 API 层面的变更务必先获得 protobuf 团队成员的明确支持再动手发 PR。写一份好的 PR 描述描述是做了什么变更、为什么做的记录若存在关联的 GitHub issue 必须附上链接。不要顺手修风格/格式除非你本来就在修改该行以解决问题否则不要附带代码风格与格式化改动——包含无关改动的 PR 不会被合并。要修格式请单独开 PR。预期评审意见并积极响应除非 PR 极其琐碎否则都应预期会有需要在合并前处理的评审意见。若对评论响应不及时PR 会在不活跃 2~3 周后被关闭。保持干净的提交历史提交历史混乱的 PR 难以评审、不会合并。使用rebase -i upstream/main整理提交历史、或拉取 main 的最新变更但避免在评审进行到一半时 rebase那会打乱评审者的评论锚点。让 PR 与 upstream/main 保持同步存在合并冲突时项目真的没法合并你的变更保持与 main 无冲突是贡献者的责任。所有测试必须通过才能合并原文档建议在创建 PR 之前就在本地跑测试尽早暴露破坏最终的绿灯由项目的测试基础设施给出。如果失败看起来与你的改动无关评审者会协助排查。本地如何跑测试CI 的 Bazel 配置即参考仓库提供了可直接复用的 CI 构建配置位于 ci/ 目录。ci/README.md 说明为了让测试支持平台相关的.bazelrc标志CI 维护了三份平台专用文件ci/Linux.bazelrc、ci/Windows.bazelrc、ci/macOS.bazelrc它们都共同 include 共享的 ci/common.bazelrcGitHub Actions 基建会按测试选择合适文件并覆盖工作区中仅供开发使用的默认.bazelrc。对贡献者最有价值的几组预置 config见 ci/common.bazelrcconfig作用关键参数dbg/opt调试 / 优化编译模式--compilation_modedbg/optasanAddressSanitizer 内存错误检测--copt-fsanitizeaddress --linkopt-fsanitizeaddressmsanMemorySanitizer含 docker-msan 变体使用插桩的 LLVM libc--fsanitizememory等tsanThreadSanitizer 数据竞争检测--fsanitizethreadubsanUndefinedBehaviorSanitizerUBSAN_OPTIONShalt_on_error1:print_stacktrace1同一文件还启用了--featureslayering_checkci/common.bazelrc注释明确this flag ensures that we remain compliant with the C layering check并开启了--verbose_failures与--announce_rc便于排查构建失败。提交涉及 C 的 PR 时本地按bazel test --configasan //...这类方式参照上述 config跑一遍就是对本地先跑测试这一条最务实的执行。五、Reviewer 准则Reviewer Guidelines原文档对评审者也是贡献者未来的行为模板提出三条要求批准前确认所有测试通过打release notes标签决定该 PR 的描述是否进入下一个版本的发布说明release notes: yes——变更应写入下一版发布说明例如新特性 / Bug 修复release notes: no——例如不改变行为的重构、来自 Google 内部代码的集成同步、测试更新等。打语言标签C、Java、Python 等这有助于识别 PR 影响的语言从而指派合适的评审者、撰写更准确的 release note、并方便未来定位问题。理解这两类标签的语义对贡献者同样有用如果你的 PR 只是内部重构预期它不会出现在面向用户的 release notes 里如果是新特性则应确保 PR 描述足以被直接采纳为发布说明。六、把规范落成检查清单结合 CONTRIBUTING.md 与仓库现状提交 PR 前可对照以下清单自查类型合规Bug 修复带测试新 API 是否先经 issue 确认性能改动是否有 benchmark可参照 benchmarks/ 的对比方式是否触碰了现有 API / wire 格式两条红线前置手续个人/公司 CLA 已签署C 改动符合.clang-format与 Google 风格分支策略常规改动进 main进入下一个 minor 版本补丁版本走先入 main、再 cherry-pick 到x.y.x发布分支PR 卫生单一关注点、描述完整且关联 issue、无顺手风格修改、提交历史经过rebase -i upstream/main整理、与 main 无冲突测试绿光本地已跑测试可复用 ci/common.bazelrc 的 asan/ubsan 等 config失败项确认与本次改动无关响应节奏能承诺在 2~3 周内持续响应评审避免 PR 被自动关闭仓库根目录的 CONTRIBUTORS.txt 记录了历年对公共版 Protocol Buffers 做出重大贡献的人员从最初的 Protocol Buffers 设计与实现者到 Proto2 C/Java、Python、Java Nano 的主写作者以及大量代码评审贡献者它本身就是这套贡献机制长期运转的产物。对协议格式与公开 API 的永不破坏承诺、对测试与 benchmark 的硬性要求、对提交纪律的严格约束共同构成了 protobuf 能够以单一 main 分支 多语言版本化发布见 version.json持续演进的原因。【免费下载链接】protobufProtocol Buffers - Googles data interchange format项目地址: https://gitcode.com/GitHub_Trending/pr/protobuf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →