因为业务需求,有赞自己造了很多轮子,组件库尤其多,React,Vue,小程序都有涉及,其他开源项目有 zan-proxy 代理,PHP 的框架 zanphp 等。有人可能会觉得奇怪,为什么有赞要造这么多轮子?其实原因真的很简单,就是因为现有的替代品无法满足我们自身业务的需求,可能是不满足我们的定制需求,也可能是功能不符合我们要求。根据业务需要,我们总结了一套适合自己的套路、规范,并把这些套路、规范做成了工具、组件库或者框架。
这大概便是有赞内部启动这些项目的缘由了。后来,随着这些项目的逐步完善,一个自然而然的想法就是把它们开源了,也许别人也有类似我们的需求。
慢慢的,有赞的 Github 上就有了好多开源项目。在维护这些开源项目的过程中我们总结了一些经验教训,在此跟大家分享。
Github 有一定的社交属性,维护好一个开源项目除了代码写得好,有一些使用姿势也是很重要的,我们总结了几点跟大家分享。
README 文件是项目给人的第一印象,所谓人靠衣装马靠鞍,开源项目有个好的脸面是很重要的,尤其是当这个项目还是一个前端项目的时候。针对 README 文件我们给出以下几点建议:
统一 README 格式的好处是让别人一眼就认出这个项目是某某公司或者某某人的,有赞内部就维护了一份 README 的规范。模版内容很简单,但是它保证了我们的项目有一定的识别度。
英文版的 README 不是为了装逼,如果你笃定自己的用户都在国内,那就只需要中文版的 README 就可以了。但是大部分情况下,项目维护者都希望自己的代码能够帮助到更多人,包括国外的用户,这时候英文 README 的价值就体现出来了。
开发指南很容易被忽略,它存在的目是帮助那些希望加入项目开发的开发者们快速上手。作为参与开源项目的开发者,他们对开发指南有哪些期望?我觉得无外乎几点:
如果开发指南能够回答这几个问题,有经验的开发者就可以比较快的参与进来。
相信很多人都遇到过这样一个尴尬的事情:有人在 Github 上提了一个 Issue,但是你看不懂这个 Issue 的描述,也不知道如何重现这个 Issue。
Github 提供了一个机制让项目维护者能够预先写好 Issue 或者 PR 的模版,其他人过来提 Issue 或者 PR 的时候就可以在这个模版上修改。模版里可以有针对性的告诉提 Issue 的人需要填写那些信息,这样子大部分时候都可以避免上面提到的尴尬场面。
创建这些模版也很简单,常见的方式是在仓库的 .github 隐藏目录下创建对应的模版 Markdown 文件。最近 Github 刚刚更新了模版机制,允许同时创建多个 Issue / PR 的模版。
例如 babel 仓库的 Issue 模版就有多个模版,每个模版对应不同的 Issue 类型,具体配置文档可以看这里。
Github 的 Labels 功能主要是用来给 Issue / PR 做分类的,方便索引和搜索。这里主要想说的一点是 Github 默认建好的 Labels 其实并不好用,我们推荐将 Label 分成几个正交的唯独,每个维度对应几个不同的 Label,可以参看这篇文章。
很多新手容易忽略 Label 这个功能,配合适当的 Label 分类,每个 Issue 都可以有一个很直观的状态展示。
Github 和 CI 系统的整合非常紧密,个人觉得体验做的很好。CI 系统可以用来做一些单元测试,代码风格检查等。很多仓库里 README 文件上的代码覆盖率数据都是在 CI 系统中生成提交的。
CI 除了用来运行单侧,还可以用来做其他必要的代码检查。例如 Zent 仓库中有一个脚本会在 CI 上检查提交的代码有没有按规范书写,如果发现代码格式不对,那么很有可能开发者没有在本地安装我们的 git 钩子,这时我们会提示开发者在本地安装钩子,格式化代码然后重新提交。
#!/bin/bash
# Ensure everyone installs the git hook.
# The result is a guess, but false positive
# is not an issue here.
RED='\033[0;31m'
basepath=$(dirname $0)
fail () {
printf "${RED}$@\nAborting\n"
exit -1
}
pushd $basepath/.. >/dev/null 2>&1
yarn prettify
git diff-index --quiet HEAD --
rv=$?
popd >/dev/null 2>&1
if [ $rv -ne 0 ]; then
git diff-index HEAD --
fail 'Git hooks not installed. Follow these instructions on your local machine:\n1. yarn install\n2. yarn prettify\n3. Commit your changes and push.'
fi
这里顺带说一下 Github 上常用的两个 CI 系统使用感受:
Github 最近又上了一个新功能 Checks API,这个功能可以看成是原来 PR 和 CI 集成的一个升级版本,可以看见更加详细的测试以及 Lint 报告。
GitHub 有两个项目管理的工具,Milestone 和 Project。Project 可以显示一个类似看板的功能,而 Milestone 的定位更加轻量,类似一个任务集合的 deadline 管理工具。对大部分开源项目而言,可能 Milestone 更加合适。
上面介绍了一些 Github 的使用技巧,这里再分享一些项目开发、发布以及维护过程的一些小技巧。一个开源项目决不仅仅是一串代码而已,它更是一个技术产品,这就要求我们以产品的要求来看待这个问题。
以前端为例,NPM 的生态中绝大部分包都是使用 Semantic Versioning 的,如果我们项目的包不按照这个规则做,那么很容易给使用者一个 “surprise”。对于版本号不必恐惧它的数字越来越大,它仅仅是一个数字而已。
相信只要是个成熟的项目肯定都有自己的编码规范,有些项目可能提供了文档,告诉代码贡献者应该如何编码,同时也会有相应的 review,确保代码是符合规范的。但是,如果仅仅是代码样式方面的规范,我们建议通过工具来确保规范的落地。我们不提供编码规范的文档,但是我们有脚本来格式化所有提交过来的代码。效果就是代码随你怎么写,但是最终提交到 master 分支上都肯定都是按相同的规范书写的。
这类格式化工具有很多,例如前端领域用的比较多的 Prettier,Go 语言自带的 gofmt,以及 Reason 的 refmt 等。花点时间 Google 一下,找一个适合你项目的格式化工具。
Github 针对 PR 提供了三种 merge 选项,这里推荐只开启 squash merge 这一种。所谓 squash merge 是指将 PR 分支上所有提交合并成一个新的 commit,然后将这个 commit 通过 fast-forward 的方式合并到目标分支,我们认为这种方式是最适合走 PR 的项目的。当然,如果你希望保留 PR 上的每一个提交记录,那么建议使用 rebase 的方式,不管是通过 Github 操作还是自己本地 rebase 后再提交。
为了减少每次发布的工作量,我们以前的更新日志是脚本根据 Github 的 Issue 以及 PR 记录自动生成的。但是我们慢慢发现由于 Isssue 以及 PR 的标题规范性不是那么好,导致更新日志的可读性变得比较差。另外一个问题是机器生成的更新日志它没法做到把同一组件的修改归类整理到一起,这也是可读性较差的一个原因。
我们现在的更新日志是通过脚本先生成一份“草稿”,然后由包的发布者在这个基础上总结提炼出一份方便阅读的更新日志。这种方式增加了一些发布者的工作量,但是更新日志的可读性有较大提升,投入产出比还是可以接受的。
“售后服务”是做开源项目的时候最容易被忽视的一点,如果我们以技术产品的要求去维护一个开源项目,那么我们就有责任给用户提供必要的支持。这些支持包括:完善的产品文档,答疑的群组以及一些产品技术博客。有了这些“售后服务”我们才能形成一个完整的技术产品闭环,通过用户的反馈不断完善。
本文从 Github 的使用姿势切入,在项目开发、发布、维护以及文档生成等方面分享了一些我们认为正确的开源项目维护心得。我们始终保持开放的心态,欢迎各位给我们提建议,一起改进开源项目的管理方式。
一些可能有用的工具链接:
欢迎关注我们的公众号
Original url: Access
Created at: 2019-09-26 18:21:51
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论