开源项目的代码,除了要遵守上面所说的编码类规范和非编码类规范之外,还要遵守下面几个规范。
第一,开源项目,应该有一个高的单元覆盖率。这样,一方面可以确保第三方开发者在开发完代码之后,能够很方便地对整个项目做详细的单元测试,另一方面也能保证提交代码的质量。
第二,要确保整个代码库和提交记录中,不能出现内部 IP、内部域名、密码、密钥这类信息。否则,就会造成敏感信息外漏,可能会对我们的内部业务造成安全隐患。
第三,当开源项目被别的开发者提交 pull request、issue、评论时,要及时处理,一方面可以确保项目不断被更新,另一方面也可以激发其他开发者贡献代码的积极性。
第四,好的开源项目,应该能够持续地更新功能,修复 Bug。对于一些已经结项、不维护的开源项目,需要及时地对项目进行归档,并在项目描述中加以说明。
# 项目名称 <!-- 写一段简短的话描述项目 --> ## 功能特性 <!-- 描述该项目的核心功能点 --> ## 软件架构(可选) <!-- 可以描述下项目的架构 --> ## 快速开始 ### 依赖检查 <!-- 描述该项目的依赖,比如依赖的包、工具或者其他任何依赖项 --> ### 构建 <!-- 描述如何构建该项目 --> ### 运行 <!-- 描述如何运行该项目 --> ## 使用指南 <!-- 描述如何使用该项目 --> ## 如何贡献 <!-- 告诉其他开发者如果给该项目贡献源码 --> ## 社区(可选) <!-- 如果有需要可以介绍一些社区相关的内容 --> ## 关于作者 <!-- 这里写上项目作者 --> ## 谁在用(可选) <!-- 可以列出使用本项目的其他有影响力的项目,算是给项目打个广告吧 --> ## 许可证 <!-- 这里链接上该项目的开源许可证 -->
开发文档:用来说明该项目的开发流程,比如如何搭建开发环境、构建二进制文件、测试、部署等。
用户文档:软件的使用文档,对象一般是软件的使用者,内容可根据需要添加。比如,可以包括 API 文档、SDK 文档、安装文档、功能介绍文档、最佳实践、操作指南、常见问题等。
例子:
docs ├── devel # 开发文档,可以提前规划好,英文版文档和中文版文档 │ ├── en-US/ # 英文版文档,可以根据需要组织文件结构 │ └── zh-CN # 中文版文档,可以根据需要组织文件结构 │ └── development.md # 开发手册,可以说明如何编译、构建、运行项目 ├── guide # 用户文档 │ ├── en-US/ # 英文版文档,可以根据需要组织文件结构 │ └── zh-CN # 中文版文档,可以根据需要组织文件结构 │ ├── api/ # API文档 │ ├── best-practice # 最佳实践,存放一些比较重要的实践文章 │ │ └── authorization.md │ ├── faq # 常见问题 │ │ ├── iam-apiserver │ │ └── installation │ ├── installation # 安装文档 │ │ └── installation.md │ ├── introduction/ # 产品介绍文档 │ ├── operation-guide # 操作指南,里面可以根据RESTful资源再划分为更细的子目录,用来存放系统核心/全部功能的操作手册 │ │ ├── policy.md │ │ ├── secret.md │ │ └── user.md │ ├── quickstart # 快速入门 │ │ └── quickstart.md │ ├── README.md # 用户文档入口文件 │ └── sdk # SDK文档 │ └── golang.md └── images # 图片存放目录 └── 部署架构v1.png
接口文档又称为 API 文档,一般由后台开发人员编写,用来描述组件提供的 API 接口,以及如何调用这些 API 接口。
在项目初期,接口文档可以解耦前后端,让前后端并行开发:前端只需要按照接口文档实现调用逻辑,后端只需要按照接口文档提供功能。
当前后端都开发完成之后,就可以直接进行联调,提高开发效率。在项目后期,接口文档可以提供给使用者,不仅可以降低组件的使用门槛,还能够减少沟通成本。
一个规范的 API 接口文档,通常需要包含一个完整的 API 接口介绍文档、API 接口变更历史文档、通用说明、数据结构说明、错误码描述和 API 接口文档。API 接口文档中需要包含接口描述、请求方法、请求参数、输出参数和请求示例。
根据不同的项目需求,API 接口文档会有不同的格式和内容。
例如:
接口文档拆分为以下几个 Markdown 文件,并存放在目录 docs/guide/zh-CN/api
中:
拿 一个user.md 接口文档为例,user.md
文件记录了用户相关的接口,每个接口按顺序排列,包含如下 5 部分。
HTTP 方法 请求路径
,例如 POST /v1/users
。在 通用说明中的请求方法部分,会说明接口的请求协议和请求地址。目前业界主流的版本规范是语义化版本规范
语义化版本规范(SemVer,Semantic Versioning)是 GitHub 起草的一个具有指导意义的、统一的版本号表示规范。它规定了版本号的表示、增加和比较方式,以及不同版本号代表的含义。
在这套规范下,版本号及其更新方式包含了相邻版本间的底层代码和修改内容的信息。语义化版本格式为:主版本号.次版本号.修订号(X.Y.Z)
,其中 X、Y 和 Z 为非负的整数,且禁止在数字前方补零。
版本号可按以下规则递增:
例如,v1.2.3
是一个语义化版本号,版本号中每个数字的具体含义见下图:
对于v1.2.3-alpha
这种版本号。这其实是把先行版本号(Pre-release)和版本编译元数据,作为延伸加到了主版本号.次版本号.修订号
的后面,格式为 X.Y.Z[-先行版本号][+版本编译元数据]
,如下图所示:
先行版本号意味着,该版本不稳定,可能存在兼容性问题,格式为:X.Y.Z-[一连串以句点分隔的标识符]
,比如下面这几个例子:
1.0.0-alpha 1.0.0-alpha.1 1.0.0-0.3.7 1.0.0-x.7.z.92
编译版本号,一般是编译器在编译过程中自动生成的,我们只定义其格式,并不进行人为控制。下面是一些编译版本号的示例:
1.0.0-alpha+001 1.0.0+20130313144700 1.0.0-beta+exp.sha.5114f85
先行版本号和编译版本号只能是字母、数字,且不可以有空格。
第一,在实际开发的时候,建议使用 0.1.0 作为第一个开发版本号,并在后续的每次发行时递增次版本号。
第二,当我们的版本是一个稳定的版本,并且第一次对外发布时,版本号可以定为 1.0.0。
第三,当我们严格按照 Angular commit message 规范提交代码时,版本号可以这么来确定: