Mojo 开源贡献全流程指南:从 Issue 表明意图到 Nightly 发布的五个阶段
2026/9/11 1:44:45 网站建设 项目流程

Mojo 开源贡献全流程指南:从 Issue 表明意图到 Nightly 发布的五个阶段

【免费下载链接】mojoThe Modular Platform (includes MAX & Mojo)项目地址: https://gitcode.com/GitHub_Trending/mo/mojo

本指南以仓库中的 contribution-process.md 为骨架,系统梳理向 Mojo 提交代码贡献的完整流程:从确认贡献区域、在 GitHub Issue 中表明意图,到制定实现计划、编写测试与代码、通过评审,最终经由!sync合入并在 Nightly 版本中发布。读完本文,你将掌握 Mojo 社区贡献的准入条件、每个阶段的明确动作与验收标准,以及大型变更应走的提案流程(proposal-process.md),并能在仓库中对应找到每一步的落地证据(构建命令、测试命令、标签与机器人注释等)。

贡献流程概览

Mojo 的代码贡献被划分为五个阶段,文档 contribution-process.md 依次描述如下:

阶段目标关键产物 / 动作
Stage 1: Prerequisites(前置准备)确认贡献区域开放,并表明意图阅读贡献区域说明;创建或认领 GitHub Issue
Stage 2: Planning(规划)研究现有实现,达成方案共识实现计划(implementation plan);accepted标签
Stage 3: Implementation(实现)提交带测试的代码测试覆盖;PR 描述中写closes #<issue-number>
Stage 4: Review(评审)社区评审 + Modular 团队批准Modular 团队成员批准方可合并
Stage 5: Merge and release(合并与发布)同步进内部 monorepo 并随 Nightly 发布注释!syncmerged externally/merged internally标签

整个过程与 Mojo/CONTRIBUTING.md、根目录 CONTRIBUTING.md 相互衔接:前者是 Mojo 贡献者的总览入口,后者补充了 fork、分支、格式化、评审时效与后台同步机制的细节。

阶段 1:前置准备

确认贡献区域处于开放状态

动手实现之前,第一步是确认你想改进的代码区域是否开放接收贡献。当前仓库中 contribution-areas.md 明确给出了各区域的开放情况:

  • 编译器(Compiler):暂不接收贡献。源码开放可读、可构建、可提 Issue,但在贡献流程成熟前不接受针对编译器的 Pull Request;
  • 标准库(Standard library):目前接收的变更类型包括——带测试/基准复现的良好文档化 Bug 修复、不牺牲可读性与可维护性且附带基准的性能改进、标准库文档改进、测试覆盖改进、将测试从FileCheck迁移到testing模块的assert_*函数、以及安全问题修复;
  • 明确不接收的类型包括:无测试的代码(尤其是核心原语)、破坏既有 API 或隐式行为语义的变更、为冷门平台增加支持、向代码库添加依赖、大范围格式化或重构、未经提案流程新增整个模块等。

如果贡献属于标准库,后续的开发细节(构建、测试、风格)见 stdlib-development.md 与 stdlib-code-style.md。

通过 Issue 表明意图

确保存在一个描述你打算修复的 Bug 或新增功能的 GitHub Issue。这向其他贡献者传递了"这项工作已有人在做"的信号,避免重复劳动。具体要求:

  1. 创建新 Issue 前先搜索既有 Issue,避免重复;
  2. 开 Issue 时遵循 issue-pr-etiquette.md 中的约定。

根目录 CONTRIBUTING.md 对"什么样的变更可以不先开 Issue"给出了更细的界定:小且明显的修复(文档/注释中的拼写与语法错误、一两行且有明确根因和清晰测试的 Bug 修复、局部文档澄清)可以直接提 PR;除此之外——新 API、重构、性能工作、行为变更、触碰公共接口、或超过约 100 行的改动——都建议先开 Issue 沟通。拿不准时就先开 Issue。

阶段 2:规划

研究现有实现

Mojo 团队认为开源软件开发带来的学习机会很有价值,建议花时间理解你要修复内容相关的既有代码。文档特别注明:可以使用 AI 辅助研究代码库,但在你打开 PR 时,应能够在无人辅助的情况下,与团队就你所提议的变更展开设计层面的讨论。这也与仓库根目录 AI_TOOL_POLICY.md 以及 issue-pr-etiquette.md 中"所有输出都必须供人类消费""你对输出全权负责"的要求一脉相承。

制定并发布实现计划

一旦有了解决方案的思路,团队强烈建议在 GitHub Issue 上发布实现计划:

  • 发布计划给了他人评论的机会,在投入具体实现前就设计达成共识;
  • 在高层面评审和调整一个计划,远比评审一个完成品实现要省时。

Modular 团队在方案达成一致时,会给 Issue 打上accepted标签,表示"我们已准备好接收对应的 PR"。

[!NOTE] 你可以在 Issue 被标记accepted之前就提交 PR。但如果你的变更是非平凡(non-trivial)的,且关联 Issue 尚未被接受,该 PR 被评审或批准的可能性会显著降低。

根目录 CONTRIBUTING.md 进一步说明了维护者的响应机制:维护者会通过添加accepted标签或留言给出"可以开始"的信号;如果你提交了非平凡 PR 却没有关联已获批准的 Issue,团队可能请你暂停 PR 并先补 Issue,以便对齐方案——这不是拒绝,而是为了让你的工作在评审中落地而不是停滞。

阶段 3:实现

为变更编写测试

文档对实现方式本身不做规定("We aren't prescriptive about how you arrive at your changes"),但有两条硬性要求:

  • 请为新增或修改的代码提供合理覆盖的测试。没有测试的 PR 极不可能被合并;
  • 如果不确定如何测试,可以在 PR 中直接说明(例如 "I have not added tests, not sure how to test this capability"),团队会乐意与你协作。

对于标准库,stdlib-development.md 给出了对应的落地命令:

# 构建标准库 ./bazelw build //Mojo/stdlib/... # 运行标准库全部测试 ./bazelw test //Mojo/stdlib/test/... # 只跑某个子目录的测试 ./bazelw test //Mojo/stdlib/test/math/... # 列出所有测试目标 ./bazelw query 'tests(//Mojo/stdlib/...)'

测试构建时断言是开启的:编译参数带-D ASSERT=all,会激活标准库中所有debug_assert,因此一个在 release 构建中被跳过的断言也可能导致测试失败;个别测试文件通过其BUILD.bazel中的_DISABLED_ASSERTIONS列表选择退出。另外,如果本地安装了pixi,可以直接用pixi run tests ./stdlib/test/bit/test_bit.mojo运行标准库测试,该脚本会自动执行等价的 bazelw 命令。

对每一行代码负责,并在 PR 中关联 Issue

打开 PR 时,你应当准备好在技术上全权负责提交的每一行代码以及 PR 描述本身:

  • 详细约定见 issue-pr-etiquette.md;
  • 在 PR 描述正文中加上closes #<issue-number>,便于维护者一眼看出该 PR 关联的 GitHub Issue。

结合 issue-pr-etiquette.md 中的协作纪律,实现阶段还应遵守:

  • 新贡献者最多同时打开2 个并发 PR
  • 每个 PR 尽量小:打开 PR 时检查 GitHub 显示的修改行数,超过 100 行尽量拆分为多个 PR(可独立则更佳);不要为了变小而删掉测试或 docstring。小 PR 带来的好处包括更高质量的评审、更快的整体评审、避免有效变更被阻塞、更少的合并冲突以及支持评审并行处理。

提交前格式化与本地验证

根目录 CONTRIBUTING.md 要求变更在提交前完成格式化,否则 CI 的 lint/格式化检查会失败。仓库根目录的bazelw包装脚本(见 bazel/docs/usage.md 了解仓库的 Bazel 用法)提供了格式化入口:

./bazelw run format

建议安装pre-commit钩子,让每次提交自动格式化:

pixi x pre-commit install

如果在 GitHub UI 上提交导致钩子未生效,可手动执行pixi x pre-commit run --all-files。提交前还应运行受影响区域的测试、在改动涉及共享基础设施时跑更广的回归测试,并以维护者的视角审阅自己的 diff。

阶段 4:评审

评审过程被视为一种交互式学习的绝佳方式:

  • 任何有见地的人都可以评审 PR,社区成员的 constructive review 受到积极鼓励;
  • 评审过程中请保持耐心,并遵守 issue-pr-etiquette.md;
  • 社区评审中的参与要求包括:全程以真人身份出席在线互动、假定善意(assume positive intent)、所有输出(代码、注释、实现计划、评论)都必须简洁清晰、能够为 diff 中的每一行辩护——即使错误来自 AI,责任也在你自身。

[!IMPORTANT]任何 PR 合并进代码库之前,都必须获得 Modular 团队成员的批准。

关于评审时效,根目录 CONTRIBUTING.md 给出了明确的承诺(存在高贡献量、维护者休假等例外情况):

  • PR 首次评审:提交后 3 周内给出首次评审或反馈(通常可能更快);
  • 后续评审:贡献者回应反馈后,通常在 5 个工作日内复审;
  • 新 Issue:提交后 10 天内完成标记与确认;
  • 提案(Proposal):团队在提交后 6 周内完成评审与讨论。

阶段 5:合并与发布

这是 Mojo 特有的"外部仓库 + 内部 monorepo"双轨合并机制。当 PR 获得批准后:

  1. Modular 团队成员在 PR 上注释!sync
  2. 该 Issue 被打上merged externally标签,modular/modular上的 PR 被关闭;
  3. 一个对应的 PR 在 Modular 的内部 monorepo 中打开,通过内部 CI 后合并;
  4. 合并后添加merged internally标签;
  5. 你的提交随下一个 nightly 版本出现在modular/modular上。

根目录 CONTRIBUTING.md 的 "Behind the scenes" 部分补充了这一机制的实现细节,可与上述流程相互印证:

  • 仓库使用Copybara工具在内部与外部仓库之间同步变更;
  • 你会看到名为 Modularbot 的机器人评论 PR 状态:Synced internally(变更已同步进内部仓库)、Merged internally(已在内部仓库合并)、Merged externally(已随最新 nightly 上线到main分支);
  • 你的 GitHub 用户名与 PR 号通过提交元数据保留(例如ORIGINAL_AUTHOR=...PUBLIC_PR_LINK=...);
  • 本仓库几乎每天在 ET 时间约凌晨 2 点与内部仓库同步一次,因此main分支可能比内部仓库滞后最多约 24 小时(阻塞性发布失败时可能更久);
  • 合并后的变更通常会在合并后一两天内出现在下一个 nightly 构建(或文档站点)中。

大型变更:走提案流程

如果你的变更不在 contribution-areas.md 所列的"我们接受的变更"范围内(即属于重大变更),第一步应当是提交书面提案(proposal)。根据 proposal-process.md:

  • 一份提案就是一个向仓库proposals/目录新增文档的 GitHub PR——仓库中已存在大量历史提案(如value-ownership.mdpattern-matching.mdenums.md等)可作为格式参考;
  • 按 contribution-process.md 打开提案 PR,并在讨论中遵循 issue-pr-etiquette.md;
  • 提案由 Mojo 标准库负责人(leads)裁决:负责人批准、所有阻塞性问题已决定、相关决定已纳入后,提案 PR 即可合并;若被推迟或拒绝,负责评审的 lead 会说明原因并关闭 PR;
  • 提案评审比普通代码变更耗时更长,团队目标是在提交后 6 周内完成评审与讨论。

提案流程的价值在于:让最广泛的社区成员有机会反馈,同时作为过去提案及其决策理由的审计日志。

相关文档导航

围绕贡献流程,仓库 Mojo/docs/contributing/ 下还有以下配套文档,可按需深入:

  • contribution-areas.md:哪些代码区域接收贡献、各区域接收哪些类型的变更;
  • issue-pr-etiquette.md:Issue/PR 互动规范、AI 辅助贡献规则与 PR 大小要求;
  • proposal-process.md:重大变更的提案流程与裁决机制;
  • stdlib-development.md:标准库开发环境搭建、构建与测试;
  • stdlib-code-style.md 与 docstring-style-guide.md:标准库代码风格与 API 文档(docstring)写作规范;
  • compiler/README.md:编译器贡献文档入口,指向 WorkingInOSRepo.md、testing.md 等编译器的构建、测试与调试资料;
  • 根目录 CONTRIBUTING.md:fork、分支、PR 创建、评审时效与后台同步机制的全流程细节,以及 CODE_OF_CONDUCT.md 与 AI_TOOL_POLICY.md 两项必须事先阅读的规范。

一句话总结:先确认 contribution-areas.md 中你的目标区域开放与否,通过 Issue 表明意图并与维护者达成accepted共识,然后带测试地实现小而有质量的 PR,遵守评审纪律,最终你的代码将以!sync为起点,经由内部 monorepo 的 CI 校验后随下一个 nightly 与所有 Mojo 用户见面。

【免费下载链接】mojoThe Modular Platform (includes MAX & Mojo)项目地址: https://gitcode.com/GitHub_Trending/mo/mojo

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询