尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

GitHub CLI 团队协作流程详解:从 gh 扩展原型到主线合入的完整路径

GitHub CLI 团队协作流程详解:从 gh 扩展原型到主线合入的完整路径 GitHub CLI 团队协作流程详解从 gh 扩展原型到主线合入的完整路径【免费下载链接】cliGitHub’s official command line tool项目地址: https://gitcode.com/GitHub_Trending/cli/cli本文基于 cli/cli 仓库中 working-with-us.md 文档系统讲解 GitHub 内部团队Hubber向gh贡献新命令的标准流程先用 Go 扩展快速原型验证再经过 UX 评审、公开预览、合入决策三关最终进入cli/cli主干。读完后你将掌握gh扩展的创建与运行机制含仓库内对应源码位置以及留在扩展还是合并进主干这一关键决策的三个判断维度。一、Step 0先写一个扩展而不是直接改 cli/cli原文档的第一条原则是即使你最终希望代码合并进gh也应该先以扩展extension的形式开始。gh扩展理论上可以任何语言编写但仓库把 Go 当作一等公民——当前go.mod直接依赖官方扩展辅助库 cli/go-gh v2版本v2.13.0这正是文档所说 ship a library of helpers for extensions written in Go 的实现事实。这条路线带来三个实际好处原文档归纳立即开始原型开发不必等待 CLI 团队排期给评审方一个可审查的具体产物而非纸面方案你可以不依赖合并直接发布扩展后续发布节奏由你自己掌控——如果你确认功能适合长期作为扩展存在原文档明确说不用看本文其余部分我们不规定扩展如何创建和发布。扩展脚手架Go 模板内置 go-gh 客户端gh extension create的 Go 二进制备板就在仓库中goBinMain.go.txt。新扩展的main.go默认就演示了如何用 go-gh 调 REST APIpackage main import ( fmt github.com/cli/go-gh/v2/pkg/api ) func main() { fmt.Println(hi world, this is the %s extension!) client, err : api.DefaultRESTClient() if err ! nil { fmt.Println(err) return } response : struct {Login string}{} err client.Get(user, response) if err ! nil { fmt.Println(err) return } fmt.Printf(running as %%s\n, response.Login) }这意味着扩展在第一天起就复用gh已有的认证、API 客户端逻辑与文档 Step 4 中把扩展改成可合并状态不会太困难的判断直接呼应。扩展的管理接口与运行时机制从源码看扩展能力由 pkg/extensions/extension.go 中的ExtensionManager接口定义覆盖完整生命周期List、Install、InstallLocal、Upgrade、Remove、Dispatch实际执行以及按模板类型Create。pkg/cmd/extension/extension.go 进一步区分三种扩展形态GitKindgit 仓库、BinaryKind带manifest.yml的二进制发布物、LocalKind本地目录版本与 URL 都是动态解析的例如 git 扩展通过git rev-parse HEAD取当前版本。扩展命令如何被用户调用到答案在根命令注册逻辑 pkg/cmd/root/root.gogh启动时遍历ExtensionManager.List()为每个扩展生成一个 cobra 子命令若扩展名与核心命令冲突则跳过核心命令优先。此外 pkg/cmd/root/root.go#L241-L250 还注册了官方扩展桩official extension stubs如 pkg/extensions/official.go 登记的aw、stack用户敲到未安装的官方扩展命令名时gh会提示安装而真实扩展与别名始终优先于桩命令。扩展全生命周期create → install → upgrade → remove有端到端验收测试佐证见 acceptance/testdata/extension/extension.txtar其中验证了扩展搜索依赖gh-extensiontopic、安装、升级行为变化、移除等完整链条。二、Step 1UX 评审——代码状态无关的第一关无论你代码写到哪一步都必须先在 issue 上发起 UX 评审公开路线在开源的cli/cli仓库开 issue保密路线在不方便公开新功能的场景下走 GitHub 内部闭源github/cli仓库。issue 中必须包含新命令的使用方式描述和模拟示例mock-up其中明确要求附上用户执行gh yourcmd --help时会打印的用法信息模拟。原文档解释了这个步骤的严肃性我们相信保持gh接口的一致性与直觉性。这一要求与外部贡献规范 CONTRIBUTING.md 中的Design proposal章节互相印证提案设计时同样要求 mock up 必须清晰展示被运行的命令和预期输出。也就是说无论内外团队gh的新命令在代码评审之前先过的是接口形态评审。三、Step 2公开预览Public PreviewUX 方案在 issue 上获得签署后需要把扩展开发到至少公开预览的质量供真实用户验证。原文档特意说明是否真的走一个面向真实用户的公开预览发布阶段由你自己决定。这一步的工程意义在于扩展形态让你可以独立发布、收集反馈而评审方看到的是已被实际使用检验过的行为而非演示代码。四、Step 3合并或不合并——三个决策问题手握公开预览版后原文档给出三个必须自问的问题它们共同构成扩展 vs 主干的决策框架1. 支持负担有多复杂如果功能需要大量或专业性的用户支持两条出路要么保持为扩展要么与 CLI 团队合作为你们团队开通cli/cli的维护者权限。原文档给出的实例是gh csCodespaces命令它足够专业复杂团队决定不把它做成扩展因为 Codespaces 是用户面很广的核心 GitHub 产品而是给 codespaces 团队仓库写权限、由他们自行维护 PR 评审流程。在仓库中对应实现位于 pkg/cmd/codespace/ 目录。CLI 团队同时坦承团队规模很小无法为任何工作承诺 SLA。2. 你想要什么发布节奏原文档明确了发布事实gh大约每两周发一个版本但如果某周变更较少可能跳过节奏无官方承诺虽然有 on-call 轮值但无法保证数小时内的紧急修复。如果这让你不安保持扩展是更稳妥的选择——扩展的发布节奏完全由你掌控。3. 目标用户是谁该功能是面向全体 GitHub 用户还是少数人判断标准是如果它与 Codespaces、Pull Requests 这类平均 GitHub 用户都会用到的能力同等普遍就是应当合入trunk的强信号否则考虑保持扩展。三个问题都倾向于合入时操作是在cli/cli开一个 issue附上扩展代码的链接进入 CLI 团队的 triage 队列由团队确认合入主干可行且恰当。五、Step 4提交 Pull Request 与后续维护责任CLI 团队签署同意后的最后一步在cli/cli开 PR 添加你的命令。原文档给出一个关键的工程前提——由于我们的代码已经在使用 go-gh把扩展改造成可合并状态不应该太困难。这一点在当前仓库中可以直接验证go.mod 中github.com/cli/go-gh/v2 v2.13.0是与 cobra、glamour 等并列的直接依赖扩展模板见第一节与主干共享同一套 API 客户端抽象改造成本主要集中在命令注册与代码结构对齐上。PR 需要链接 Step 3 打开的 issue以提供上下文。同时原文档设定了明确的长期责任合并进cli/cli的非平凡命令你的团队需要继续长期维护。CLI 团队可以在 first responder 轮值中把 issue 转派给你们但无法承担你们新命令的全部支持负担。六、其他协作注意事项原文档Other considerations一节的三条约定完整转述如下保密需求如果在发布前对保密性要求很高可联系 CLI 团队Slack#cli频道他们会给出私有合并方案异步优先CLI 团队横跨多个时区、高度异步协作首选沟通渠道是 issue 与 PR 评论承诺 24 小时内响应Slack 上可以 ping但通常不是我们的偏好结对开发CLI 团队乐于在扩展编写上结对——主动提出需要指导后可安排同步时间一起工作。七、决策要点小结决策维度倾向保留为扩展倾向合入 cli/cli 主干支持负担需要大量/专业性支持且拿不到仓库维护权限有团队可承接长期维护或可像 codespaces 一样获得维护者权限发布节奏需要频繁发布或紧急修复能力每两周左右一次、可能跳版的节奏可接受目标用户少数/特定人群使用面向平均 GitHub 用户的普遍能力保密要求无特殊要求可走私有合并通道需与 CLI 团队协商外部贡献者请注意本流程面向 GitHub 内部团队外部贡献者应遵循 CONTRIBUTING.md 的通用规范例如仅接受带help wanted标签 issue 的 PR、设计提案需走 design proposal 模板。【免费下载链接】cliGitHub’s official command line tool项目地址: https://gitcode.com/GitHub_Trending/cli/cli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表