一个开源项目维护者的笔记:为什么我关闭 PR

2023-10-10 02:48

本文主要是介绍一个开源项目维护者的笔记:为什么我关闭 PR,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我在 GitHub 上和其他地方维护着许多的开源项目(截止本文写作时超过 160 个)。在过去几年里,我已经合并 以及/或者 关闭了上千个 Pull Requests (PRs) 和补丁,现在想在这里总结一下我不合并许多 PRs 的原因。

我的几个项目都有协同维护者,但是大多数只有我一个人维护。因此巴士系数是很低的,但我通过授予非常开放的许可证和鼓励 fork 来抵消。我还花了一定的时间(平均为 5-10 小时/周)对我的 OSS 项目进行维护,并且有约 1000 美元/年的个人预算,用于支持项目的基础设施(这比那些使用我项目盈利的公司投入到 OSS 的还多,心塞)

我不喜欢在没合并的情况下关闭 PR,因为 PR 意味着有人喜欢我的项目,值得贡献。但有些时候这是有必要的。我不想成为一个混蛋(我通常会首先感谢贡献者以尝试减轻一个关闭的 PR 给贡献者带去的打击),之所以这样做只是为了保证项目的持续健康。下面是一些我维护项目背后的原则,希望大家通过阅读它们,能更了解为什么我选择关闭 PR 而不是合并它们。

评估 Pull Requests 的原则

对于我维护的项目(事实上大多数是我工作中使用的软件),我认为以下的原则是最重要的,如果一个项目不坚守这些原则,我通常会选择关闭 PR。

一切都应该通过自动化测试

几乎每个我维护的项目都至少全面覆盖了通过 Travis CI,Jenkins 或其他 CI 系统的 ‘happy path’。If You Breaka My Tests I Breaka You Face。但也会有少数例外的情况,如果所有测试都不通过,我不会合并 PR。我也不会合并具有大量新的、未测试功能的 PR。我不要求覆盖 100% 的单元测试,但所有的 happy path 应该经过测试。

可维护性 > 完整性

我不会去迎合每一个人,我通常只会满足自己。而且对于 98% 我自己的 OSS 项目,实际上我在使用它们,无论是在生活还是生产中(通常是数十或者数百个项目)。所以通常我都会对它们感到满意。

我不会为我的项目添加给我增加维护负担的东西,除非它是非常引人注目的功能或者是明显的错误修正。我也不会维护一个我自己都完全不明白的系统,所以我喜欢让事情变得更 “轻量” 并砍掉一些边缘情况,而不是增加一些我没有时间偿还的技术债务。

满足 80% 的用例

我看过很多 PR 的一次性功能,但却从未在别的地方看到过。当然,也许会存在 unicorn 系统需要在一些功能模糊的 app 中配置繁琐的细节……但我不会在我的项目引入这样的代码,因为:

a)我不使用它,所以我不能保证它

b)它增加了维护开销 — 即使它是一个 “简单” 的添加

所以如果你是 unicorns 之一,请 fork 我的项目,我不会觉得被冒犯。我的公共项目几乎都是旨在解决最常见的问题,而且我还尝试通过 fork 或者扩展我的项目来使它更容易地发展得更深入。

使用正确的语法

通常,我的自动化测试内置了自动化语法审查功能。但如果没有的时候,请确保基本的东西,例如间距、变量命名约定、行结束、空格而不是制表符,等等遵循项目的一般风格。我会经常合并代码然后修改成自己的代码风格,但最好是不必这样做,而且我更愿意合并没有风格怪癖的 PR。

不要改变架构

(除非首先在 issue 中讨论)

我曾经遇到过这样的 PR:整个项目架构或测试架构被交换掉了。我永远不会合并类似这种的 PR,除非它首先在 issue 中已经经过彻底讨论(并被批准)。每样东西以某种方式的存在都有它的理由(事实上是多个理由)。这并不是说我的架构或测试总是正确的,但我不会合并一些使我更难理解我项目是如何工作的东西。

不要在一个 PR 中更改超过 50 行代码

(除非你有很好的理由)

我经常收到有人提交了一个 PR 的通知,我跳过去审查它,然后看到 20 个文件被更改了 800 行代码,添加了 12 次提交。如果这是一个之前在 issue 中讨论的架构更改,我可以理解会有这样一个大型的 PR,我也会花时间去阅读它。但任何超过约 50 行的变化,我的大脑没有能力在不到一个小时的时间内完成一个良好的代码审查。

结论:“No” 是默认的回复

这个过程中最大的讽刺之一是,一些打开 issue 及其附随 PR(最持久的|烦人的|困难的 PR) 的人,通常是那些希望解决他们自己项目中某个问题的人,但在代码被合并之后会立即消失。他们意识到(通常不是很明确)如果他们能够说服我维护他们的  “雪花代码(snowflake code)”,就可以减轻自己一直存在的技术负担。

如果贡献者愿意与项目建立长期的关系,我也会愿意放手一些对架构的控制。但他们必须证明我可以相信他们。我刚开始的项目里的最好的贡献者是那些在他们的盈利性工作中使用这些项目的人,他们会每周拿出一个小时或两个小时来帮助处理 issue 队列,关闭无效 issue,以及提交简单 bug 修复的 PR(特别是与他们最熟悉的项目相关部分)。

对于任何维护 OSS 项目的人:确保你有一套完善的原则可以用来评估 PR。而且当 PR 不符合你的标准时,记住要随时 SAY NO!太多的项目由于接受了太多没有为长期可维护性而评估的新特性,导致项目最后不受控制,但这只是一个可以通过简单两个字而避免的问题。


这篇关于一个开源项目维护者的笔记:为什么我关闭 PR的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/177395

相关文章

Ubuntu中Nginx虚拟主机设置的项目实践

《Ubuntu中Nginx虚拟主机设置的项目实践》通过配置虚拟主机,可以在同一台服务器上运行多个独立的网站,本文主要介绍了Ubuntu中Nginx虚拟主机设置的项目实践,具有一定的参考价值,感兴趣的可... 目录简介安装 Nginx创建虚拟主机1. 创建网站目录2. 创建默认索引文件3. 配置 Nginx4

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin

如何关闭 Mac 触发角功能或设置修饰键? mac电脑防止误触设置技巧

《如何关闭Mac触发角功能或设置修饰键?mac电脑防止误触设置技巧》从Windows换到iOS大半年来,触发角是我觉得值得吹爆的MacBook效率神器,成为一大说服理由,下面我们就来看看mac电... MAC 的「触发角」功能虽然提高了效率,但过于灵敏也让不少用户感到头疼。特别是在关键时刻,一不小心就可能触

无需邀请码!Manus复刻开源版OpenManus下载安装与体验

《无需邀请码!Manus复刻开源版OpenManus下载安装与体验》Manus的完美复刻开源版OpenManus安装与体验,无需邀请码,手把手教你如何在本地安装与配置Manus的开源版OpenManu... Manus是什么?Manus 是 Monica 团队推出的全球首款通用型 AI Agent。Man

Nginx实现高并发的项目实践

《Nginx实现高并发的项目实践》本文主要介绍了Nginx实现高并发的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用最新稳定版本的Nginx合理配置工作进程(workers)配置工作进程连接数(worker_co

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,