s_dev_guidelines 开源项目分析
目录
- 摘要
- 一、项目概览
- 二、核心文档逐一解析
- 三、三份规范的协同关系(工程闭环)
- 四、整体设计特点与亮点
- 五、适用场景与落地建议
- 六、总结
一、项目概览
1.1 项目定位
| 项 | 内容 |
|---|---|
| 项目名称 | Dev Guidelines — 软件开发规范集 |
| 仓库地址 | https://gitee.com/smallerxuan/s_dev_guidelines |
| 项目性质 | 纯文档型仓库(无代码、无构建系统) |
| 适用范围 | 通用库、应用程序、服务、嵌入式固件等各类软件项目 |
| 开源协议 | CC BY 4.0(知识共享署名,允许商用与修改,需署名) |
1.2 仓库结构
s_dev_guidelines/ ├── README.md # 项目说明:收录文档、特点、用法、Roadmap ├── C语言代码编写规范.md # 13 章 C 编码规范 ├── Git 提交信息规范.md # Conventional Commits 指南 ├── Git 分支管理规范.md # 精简版 Git Flow └── LICENSE # CC BY 4.0 许可证全文1.3 规范基准
三份文档各自锚定业界公认基准,而非凭空自创:
| 文档 | 规范基准 | 本地化取舍 |
|---|---|---|
| C 语言代码编写规范 | Linux Kernel Style + GNU Coding Standards | 缩进改为 4 空格(Kernel 原版为 Tab);禁用stdbool.h |
| Git 提交信息规范 | Conventional Commits v1.0.0 | subject 允许中文祈使句;scope 列表留待项目自定义 |
| Git 分支管理规范 | Git Flow / GitHub Flow | 精简 + 可裁剪:LTS、variant 均为可选层 |
二、核心文档逐一解析
2.1 《C 语言代码编写规范》(13 章)
这是三份文档中体量最大的一份,覆盖 C 项目编码的完整生命周期。
章节结构:
| 章节 | 主题 | 核心规则 |
|---|---|---|
| 1 | 命名规范 | 小写下划线为主风格;prv_前缀表 static 私有函数;禁驼峰、禁匈牙利命名、禁单字母变量 |
| 2 | 格式化与排版 | 4 空格缩进禁 Tab;K&R(1TBS) 大括号;行宽 80/120;单行if必须带大括号 |
| 3 | 文件组织 | 源文件 8 段式结构(文件头→include→宏→类型→全局→静态→原型→实现);include/src/tests/docs目录建议 |
| 4 | 数据类型 | 强制stdint.h定宽类型;size_t表长度;禁止用 typedef 隐藏 struct |
| 5 | 变量与常量 | 就近声明、最小作用域、一行一声明、声明即初始化;全局变量加g_前缀并尽量static |
| 6 | 函数设计 | 单页原则(50–80 行);嵌套 ≤3–4 层;输入参数在前输出在后;错误码用负值枚举 |
| 7 | 指针与内存 | int *p(星号靠变量);指针显式!= NULL比较;free 后置空;禁用 VLA |
| 8 | 宏与预处理 | 宏全大写加项目前缀;参数必须加括号;多语句宏用do-while(0);优先 inline 函数替代 |
| 9 | 注释规范 | Doxygen 风格文件头/函数注释(@brief/@param/@retval/@warning);TODO/FIXME/HACK 标记 |
| 10 | 错误处理 | 负值错误码枚举;早期返回与goto集中清理两种模式;assert 与运行时检查分工 |
| 11 | 头文件管理 | 最小包含、自包含、前向声明优先;#ifndef保护或#pragma once;extern "C"兼容 |
| 12 | 编译与构建 | -Wall -Wextra -Werror基线 + 9 个增强警告;新项目用 C11;列明 clang-tidy/cppcheck/sparse |
| 13 | 代码审查清单 | 10 项 Checklist + 完整 ring_buffer 示范代码 |
附录:.clang-format完整配置(可直接落盘使用)、8 组常见错误对照表。
值得注意的取舍(与 Kernel Style 的差异):
- 缩进用 4 空格而非 Tab:Linux Kernel 原版要求 Tab(8 字符宽),此处明确改为 4 空格,更贴近嵌入式厂商 SDK 与现代团队习惯;
- 布尔值用
uint8_t + 0/1,不用stdbool.h:规避部分老旧嵌入式工具链的兼容问题,属于面向受限平台的保守选择; - 禁止 typedef 隐藏 struct:与 Kernel Style 一致,保持类型透明,便于追踪内存布局——这对需要关注对齐、大小的嵌入式场景尤为重要。
2.2 《Git 提交信息规范》(8 章)
基于 Conventional Commits v1.0.0 的完整中文化落地指南。
核心格式:
<type>(<scope>): <subject> <body> <footer>要点结构:
| 部分 | 内容 |
|---|---|
| type 类型表 | 11 种类型(feat/fix/docs/style/refactor/perf/test/chore/ci/build/revert),并标注各自触发的 SemVer 级别 |
| scope 作用域 | 提供 11 个通用 scope 参考(core/api/net/parser/deps…),明确"各项目应自定义 scope 列表" |
| subject 规则 | 祈使句现在时、≤50 字符、末尾无句号,附 ❌/✅ 对照 |
| body/footer | body 解释"为什么"而非"是什么";footer 承载Closes #xxx、BREAKING CHANGE:、Co-authored-by: |
| 完整示例 | 新功能、Bug 修复、破坏性变更三个带上下文的真实示例 |
| 特殊场景 | Merge Commit、revert、WIP(含[skip ci]用法) |
| 工具链 | commitlint 完整配置(含 scope-enum、header-max-length 等 6 条规则)、husky 钩子、pre-commit/Lefthook 跨语言替代 |
| SemVer 映射 | BREAKING CHANGE→MAJOR、feat→MINOR、fix→PATCH,其余不升版 |
设计亮点:没有把 scope 列表写死,而是将其定位为"项目预留扩展点",并在 commitlint 配置的注释中明确提示按项目模块调整——这与整套规范"通用版 + 项目裁剪"的总设计哲学一致。
2.3 《Git 分支管理规范》(10 章)
以精简版 Git Flow为基线的分支模型,是三份文档中架构性最强的一份。
模型选型(第 1 章):先横向对比 Git Flow / GitHub Flow / GitLab Flow / Trunk-based 四种主流模型,再给出选型结论——保留main/develop双长期分支 +feature/release/hotfix三类短期分支。
分支职责(第 3 章,核心):
| 分支 | 性质 | 检出源 | 合并目标 | 关键约束 |
|---|---|---|---|---|
main | 长期 | — | — | 仅存已发布版本;每个合并点打 SemVer 标签;禁止直接提交 |
develop | 长期 | — | — | 允许已知缺陷但须通过编译+冒烟;版本号加-dev后缀 |
feature/* | 短期 | develop | develop | 一功能一分支;超 2 周须拆分;禁止混更依赖版本 |
release/v* | 短期 | develop | main+develop | 冻结新功能;支持-rcN候选轮次 |
hotfix/* | 短期 | main标签 | main+develop | 优先级最高;必须验证双侧包含相同修复 |
main-v*.x | 长期(可选) | main标签 | — | LTS 维护,只收 hotfix 不收 feature |
variant/* | 长期(可选) | main | cherry-pick 回流 | 多平台/多客户变体;优先推荐条件编译替代 |
chore/* | 短期 | develop | develop | 依赖升级等杂项独立分支 |
合并策略(第 4 章):Rebase vs Merge 决策表是亮点——本地同步用 rebase 保持线性、合入 develop 用--no-ff保留功能节点、已推送公共分支绝对禁止 rebase/amend。
分支保护(第 5 章):给出可直接照抄的服务端配置矩阵(main需 2 人审查 + 全量 CI、develop需 1 人审查 + 编译检查等)及 GitLab 配置示例。
延伸章节:
- 第 6 章通用项目管理:构建产物命名规范(
{project}_v{x.y.z}_{variant}_{date}.{ext})、submodule 更新流程、密钥与配置分离; - 第 7 章仓库组织:Monorepo vs Polyrepo 决策表,推荐"Monorepo + 分目录隔离"并附目录树;
- 第 8 章快速决策流程图(开始新功能/紧急修复/依赖升级/发布四条路径);
- 附录:分支生命周期速查表、常用命令速查、版本号与分支对应关系图。
嵌入式特色:LTS 分支(对应已交付固件的长期维护)与 variant 分支(对应多硬件平台/客户定制)是典型嵌入式诉求,但文档同时强调"优先用条件编译/分目录隔离替代变体分支",避免了分支碎片化——这个取舍说明体现了对实际工程复杂度的清醒认识。
三、三份规范的协同关系(工程闭环)
三份文档不是孤立堆砌,而是构成一条从单次提交到正式发布的完整链路:
feat/fix 提交(提交规范) │ type 决定 SemVer 级别 ▼ 版本号递增 v{MAJOR}.{MINOR}.{PATCH}(提交规范 附录B) │ release 分支合并到 main 时打标签 ▼ main 上的语义化标签(分支规范 3.1) │ 标签触发 CI ▼ 发布产物 + 自动 CHANGELOG(分支规范 6.1 + git-cliff) │ ▼ C 代码本身的质量由编码规范 + Code Review Checklist 兜底具体咬合点:
- scope 一致性:分支规范中 feature 分支命名
feature/{scope}-{description},与提交规范的 scope 概念同源,模块名贯穿分支名与提交信息; - SemVer 贯穿:提交规范的 type→SemVer 映射,正是分支规范中
main打v{x.y.z}标签、hotfix升 PATCH 的依据; - 质量门禁互补:C 规范的编译警告基线(
-Werror)与 Review Checklist,恰好对应分支保护策略中的"CI 全量测试通过"和"PR 审查"要求; - 依赖管理呼应:提交规范的
chore(deps):类型,对应分支规范中依赖升级必须走独立chore/update-*分支、禁止在 feature 中混更。
四、整体设计特点与亮点
4.1 结构化程度高
每份文档统一采用"对照表格 + 速查卡 + Checklist"三件套。表格承担"可查"职能,Checklist 承担"可执行"职能,速查卡承担"可记忆"职能——三者分别对应 Code Review、提交前自检、日常查阅三种使用场景。
4.2 正误示例对照
关键规则均有 ❌/✅ 对照(命名、指针声明、提交信息 subject、宏括号等),比纯文字规则的学习成本低得多。C 规范末尾还给出一份 700 行级的完整 ring_buffer 示范模块,把文件头、错误码、assert、内存管理全套规则串了一遍。
4.3 "规则 + 理由 + 何时可简化"三段式
不只给规则,还说明为什么以及何时可以放松:
- 单人项目可简化为 GitHub Flow(分支规范 3.8);
- 变体分支优先用条件编译替代(分支规范 3.7);
- 单人项目 PR 审查可豁免(分支规范 4.1)。
这种"有取舍说明"的写法,避免了规范沦为教条。
4.4 工具链配置开箱即用
.clang-format、commitlint.config.js、husky 钩子、GitLab 分支保护配置均可直接复制落地,且文档间互相指引(如 README 的"团队落地建议"直接指向分支规范第五章)。
4.5 通用版 + 预留扩展点
所有项目相关变量(scope 列表、变体命名、目录结构)都显式标注为"按项目实际调整",文档末尾统一预留了"各项目可增补私有约定"的说明,二次采纳的摩擦很小。
五、适用场景与落地建议
5.1 适用性评估
| 场景 | 适配度 | 说明 |
|---|---|---|
| 嵌入式固件团队 | ★★★★★ | C 规范面向受限平台做了取舍(禁 VLA、禁 stdbool、定宽类型);LTS/variant 分支直击多平台维护痛点 |
| 通用 C/C++ 库开发 | ★★★★★ | 头文件管理、错误码设计、错误处理两模式直接可用 |
| 小团队/个人项目 | ★★★★☆ | 提供了简化模型与审查豁免,可低门槛起步 |
| 大型 Trunk-based 团队 | ★★☆☆☆ | 基线模型是 Git Flow,与高频集成的主干开发模式取向不同 |
| 非 C 语言项目 | ★★★☆☆ | Git 两份规范完全通用,C 规范仅命名/格式化思路可参考 |
5.2 推荐的采纳路径
- 第一步(成本最低):采纳《Git 提交信息规范》,配 commitlint + 钩子,一周即可全员生效;
- 第二步:采纳《Git 分支管理规范》并在 Git 服务端配置分支保护(第五章表格可直接照抄);
- 第三步:以《C 语言代码编写规范》附录的
.clang-format统一存量代码格式,再在 CI 加入警告基线; - 第四步:按项目实际增补 scope 列表、变体命名等私有约定,形成项目版规范。
六、总结
s_dev_guidelines 是一套完成度较高的中文工程规范集。其核心价值不在单条规则的创新(规则均有成熟出处),而在于三点:
- 体系化:编码、提交、分支三个环节不是孤立的,而是通过 SemVer、scope、CI 门禁互相咬合,形成完整工程闭环;
- 可落地:每条规则配理由、每个章节配速查、每个工具配配置,拿去即用;
- 有取舍:明确标注何时可以简化、何处留给项目自定义,避免了规范常见的教条化问题。