如何做好一个开源项目(一)

做好一个开源项目其实是一件比较费时费力费心的工作,它的最大难点除了代码维护之外,还包括后期的维护和持续的跟进。我曾经做过不少开源项目,但是坚持下来的,目前有信心能够持续维护的也只有Magicodes.IE。这里请允许我来一波硬广:


Magicodes.IE

导入导出通用库,支持Dto导入导出以及动态导出,支持Excel、Word、Pdf、Csv和Html。已加入NCC开源组织。

  • Github:

    https://github.com/dotnetcore/Magicodes.IE

  • 码云(手动同步,不维护):

    https://gitee.com/magicodes/Magicodes.IE

如何打造一个好的开源项目?

我们回归正题。如何做好一个开源项目呢?接下来来说道说道:

1)有一个好的理念和创意

如果大家都在做重复的事情,但是又没有合适的轮子的时候,那么我们就可以创造一个。

如果轮子很多,但是没有好用的,或者不够通用,那么我们就可以动手写一个。

Magicodes.IE就是在这种情况下诞生的。导入导出是一个非常普遍的场景,相关的组件也很多,比如就拿导出Excel来说,主流的就有EPPlus、NPOI等等库。那么为什么我们还需要再造轮子呢?因为我们发现,在大部分场景下使用这些库我们都需要进行一些重复性的编码以及特定针对Excel的操作的编码才能满足我们的需求,那么有没有更合适的做法?所以就有了Magicodes.IE,通过设置Dto就能满足大部分导入导出的场景,并且还支持除了Excel之外的其他导入导出格式。

2)写好代码

代码规范,易于阅读这些都是必不可少的。尤其是在多人远程协作的情况下,代码审阅,定期重构也非常有必要。否则大家就算是想贡献代码,但是也要看得懂不是?

3)充分的测试

代码写好了,上去就是干明显就是挖坑。随着项目的时间越长,代码重构或者功能迭代就越需要测试的保障,而不是个人感觉或者编译通过即可。

那么如何做好充分的测试呢?

1.完善的单元测试

每一次功能迭代或者Bug修复,均要完善好相关的单元测试。单元测试是代码可靠程度的最基本的保障。

2.尽可能提高代码覆盖率

代码覆盖率作为一个指导性指标,可以一定程度上反应测试的完备程度,是软件质量度量的一种手段。100%覆盖的代码并不意味着100%无bug的应用,代码覆盖率作为质量目标没有任何意义,而我们应该把它作为一种发现未被测试覆盖的代码的手段。

通过代码覆盖率测试,我们可以了解测试过程中覆盖和未覆盖的地方,可能存在的风险。分析未覆盖代码,反推在测试设计是否充分,进一步明确测试设计阶段的问题。

代码覆盖率测试也有助于我们发现测试死角、冗余代码、历史废弃代码,便于重构。

3.使用自动化测试来保障每次提交和验证PR

开源项目有很多DevOps的服务可以选择,我们可以基于其打造自己的自动化测试来保障开源项目的质量,以针对每次提交、PR进行验证,并且作为资源发布的参考依据。


4)友好的文档

文档一直是开源项目运作的一个难题:

  • 代码写的欢,文档难产。

  • 本地化文档(中文文档)没问题,其他语言文档(英文文档)难以编写。

  • 文档的更新永远跟不上代码的更新,版本的迭代。

友好的文档一直是开源项目吸引用户的首要标准,所以文档是必须的。

Magicodes.IE的文档也在积极补充和完善之中,希望大家能够多多支持:

  • Magicodes.IE之导入学生数据教程

  • Magicodes.IE基础教程之导出Excel

  • Magicodes.IE基础教程之导出Pdf

  • Excel模板导出之导出教材订购表

  • 使用Magicodes.IE.Excel完成Excel图片的导入和导出

5)版本规划和管理

对于开源项目来说,版本规划和发布版本也不应该是一件随意的事情。毕竟错误的版本可能会给用户带来灾难性的问题。不合理的规划,也可能会将项目带入沟渠。

这里分享几个经验:

  • 版本规划我们通过收集反馈来进行规划。如Magicodes.IE就通过Issue收集用户反馈、讨论以推出新的版本:

  • 资源发版提供详细的版本日志,以供用户参考和追踪:

  • 测试版预先发布Beta版的包,如上图中的2.2.0-beta2。


6)做好推广

其实也就是让可能需要他、真正需要他的人知道他的存在。从技术人的角度建议如下:

  • 和技术社区合作,分享干货,不水群,不瞎聊

  • 加入知名开源组织,比如Magicodes.IE就加入了NCC开源组织

  • 不要理会喷子。干自己认为有价值的事情,不要理会那些只会喷但是啥也不会做的麻瓜。对于开源作者伤害最大的其实就是喷子和嘴炮,大家都是利用业余精力去支持和付出,为社区做贡献,不图你支持,但是希望你别图一时嘴快!不爱用那你就滚啊,不好用那你写个更好用的分享出来啊!


7)关注反馈,持续更新

  • 从Issue中来,到代码中去。

    在开源项目达到一定规模时,社区就会给出非常多的反馈。这是单兵作战肯定是不适合的,那么适时组成自己的开源团队或者开源管理委员会就非常有必要了。同时,社区反馈的很多问题往往都是过于偏具体业务的需求,这时就需要我们去抽取出通用的需求了。

  • 欢迎PR,及时处理PR!

    开源项目在前期往往均只能利用业余精力运作,那么每一个PR都是非常宝贵的,团队一定要及时验证并处理。先以功能优先,再适当重构。

  • 大小版本提前规划,小版本快速迭代!

开源项目既需要有长期的规划,以确保长期的方向,也需要有短期的计划和目标。这样对团队对用户都是有帮助的。同时小版本规划或者考虑的功能也可以通过Issue的方式和用户探讨:


最后

本篇仅是笔者结合Magicodes.IE讲解如何做好一个开源项目的第一篇,接下来,我们会讲解如何基于开源项目完成徽章、DevOps等等。

转载是一种动力 分享是一种美德

如果喜欢作者的文章,请关注【麦扣聊技术】订阅号以便第一时间获得最新内容。本文版权归作者和湖南心莱信息科技有限公司共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

文档官网:docs.xin-lai.com

QQ群:

编程交流群<85318032> 

产品交流群<897857351>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Abp商业版 - Identity Server模块

该模块提供了Identity Server的集成和管理功能.建立在IdentityServer4类库之上.管理系统中的客户端,身份资源和API资源(Clients, Identity resources, API resources)设置客户端(Clients)权限.轻松创建标准的身份资源(例如role, profile)创建自定义身份资源(identity resources…

洛谷 P1162 填涂颜色-dfs染色法

输入: 6 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 1 1输出: 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 2 2 1 1 1 2 2 2 1 1 2 2 2 2 1 1 1 1 1 1 1代码如下: #include <iostream> using namespace std; const int N 40; int mp[N][N], mps[N][N…

15个基本的C#面试问题

原文来自互联网&#xff0c;由长沙DotNET技术社区【笑语】编译。原文来自&#xff1a;https://www.toptal.com/c-sharp/top-10-mistakes-that-c-sharp-programmers-make1、给定一个int数组&#xff0c;编写方法以统计所有偶数的值。有很多方法可以做到这一点&#xff0c;但是最…

洛谷 P1122 最大子树和-求树的最大子树权值和

输入: 7 -1 -1 -1 1 1 1 0 1 4 2 5 3 6 4 7 5 7 6 7输出: 3代码如下: #include <iostream> #include <vector> using namespace std; const int N 100010; typedef long long LL; LL ans; vector<LL>t[N]; LL w[N];void dfs(int root, int fa) {for (int…

玩转控件:封装Dev的LabelControl和TextEdit

缘由俗话说的好&#xff1a;"工欲善其事必先利其器"&#xff0c;作为软件攻城狮也是同样道理&#xff0c;攻城狮开发的软件目的是简化客户的操作&#xff0c;让客户动动手指就可以完成很多事情&#xff0c;减少人力成本。这也是系统/软件存在的目的。那对于攻城狮来说…

洛谷 P1958 上学路线-dfs

输入: 5 4 3 2 2 2 3 4 2输出: 5注意点:这题目输入的时候先输入列&#xff0c;再输入行&#xff0c;这点要注意&#xff0c;然后这个图跟我们二维数组是反过来的&#xff0c;所以题目说得向北走要变成向南走&#xff0c;注意一下细节就好了。 代码如下: #include <io…

.NET Core开发实战(第33课:集成事件:使用RabbitMQ来实现EventBus)--学习笔记(下)...

33 | 集成事件&#xff1a;使用RabbitMQ来实现EventBus为了演示我们的发布和订阅的话&#xff0c;我们在这里的代码做一些稍微的调整namespace GeekTime.API.Application.DomainEventHandlers {public class OrderCreatedDomainEventHandler : IDomainEventHandler<OrderCre…

文本框赋值guide matlab,科学网-Matlab: 学习GUI (使用GUIDE时需注意的几个问题)-刘磊的博文...

在博文《Matlab&#xff1a;学习GUI(一个简单的例子)》(介绍的方法是完全用代码来建立一个GUI&#xff0c;实际上Matlab本身有一个设计GUI的交互系统——GUIDE&#xff0c;用户可以使用该系统更方便的建立自己的GUI.本文将介绍使用GUIDE时常常遇到的几个问题。本文将通过一个简…

洛谷 P1294 高手去散步-邻接矩阵+dfs-求无向图的一条最长路径

输入: 4 6 1 2 10 2 3 20 3 4 30 4 1 40 1 3 50 2 4 60输出: 150邻接矩阵&#xff1a; 代码如下: #include <iostream> using namespace std;int ans -1; const int N 25; int mp[N][N]; bool vis[N]; int n, m; void dfs(int u, int sum) {ans max(ans, sum);for …

论ORM框架—EntityFrameworkCore

欢迎大家阅读《朝夕Net社区技术专刊》我们致力于.NetCore的推广和落地&#xff0c;为更好的帮助大家学习&#xff0c;方便分享干货&#xff0c;特创此刊&#xff01;很高兴你能成为忠实读者&#xff0c;文末福利不要错过哦&#xff01;01PARTORM框架ORM&#xff08;Object Rela…

苏老师首播3小时!超500人观看!录屏!源码!PPT……你要的都在这里!

点击视频 ☝ 回顾直播现场2020年3月25日晚18&#xff1a;30&#xff0c;“盛派周三分享”首次直播交流会&#xff0c;由盛派技术团队带头人Jeffrey&#xff0c;苏震威老师主持、分享&#xff0c;主题是《SCF 框架介绍快速创建项目演示》。此次直播历时3个多小时&#xff0c;500…

[蓝桥杯][算法提高VIP]数的划分-dp

题目描述 一个正整数可以划分为多个正整数的和&#xff0c;比如n3时&#xff1a; 3&#xff1b;1&#xff0b;2&#xff1b;1&#xff0b;1&#xff0b;1&#xff1b; 共有三种划分方法。 给出一个正整数&#xff0c;问有多少种划分方法。 输入 一个正整数n 数据规模和约定 …

十问十答 GPL 许可证

GPL 是 GNUs General Public License 的缩写&#xff0c;翻译成中文叫 GNU 的通用公共许可证&#xff0c;是最受欢迎的开源许可证之一。它由理查德斯托曼&#xff08;Richard Stallman&#xff09;创建&#xff0c;目的是保护 GNU 软件免于被专有&#xff0c;是基于他「版权向左…

oracle consistent gets,oracle构建一致性读

对于实际的业务系统&#xff0c;通常有一些热点的表&#xff0c;insert和delete的量非常大&#xff0c;这个时候就会发现一些查询语句的逻辑读比较偏高&#xff0c;这时可能就是oracle在构建一致性块的进行的consistentread。下面做一个测试看下&#xff1a;第一步准备数据&…

解析“60k”大佬的19道C#面试题(上)

解析“60k”大佬的19道C#面试题&#xff08;上&#xff09;先略看题目&#xff1a;请简述 async函数的编译方式请简述 Task状态机的实现和工作机制请简述 await的作用和原理&#xff0c;并说明和 GetResult()有什么区别Task和 Thread有区别吗&#xff1f;如果有请简述区别简述 …

通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[上篇]

《200行代码&#xff0c;7个对象——让你了解ASP.NET Core框架的本质》让很多读者对ASP.NET Core管道有了真实的了解。在过去很长一段时间中&#xff0c;有很多人私信给我&#xff1a;能否按照相同的方式分析一下MVC框架的设计与实现原理&#xff0c;希望这篇文章能够满足你们的…

通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[中篇]:请求响应

《200行代码&#xff0c;7个对象——让你了解ASP.NET Core框架的本质》让很多读者对ASP.NET Core管道有了真实的了解。在过去很长一段时间中&#xff0c;有很多人私信给我&#xff1a;能否按照相同的方式分析一下MVC框架的设计与实现原理&#xff0c;希望这篇文章能够满足你们的…

洛谷 P2853 [USACO06DEC]Cow Picnic S-dfs

输入: 2 4 4 2 3 1 2 1 4 2 3 3 4输出: 2代码如下: #include <iostream> #include <vector> #include <cstring> using namespace std; const int N 1010; bool vis[N]; vector<int>v[N]; int r[N]; int mk[N];void dfs(int u) {mk[u];for (int i …

.NET Core开发实战(第34课:MediatR:轻松实现命令查询职责分离模式(CQRS))--学习笔记(上)...

34 | MediatR&#xff1a;轻松实现命令查询职责分离模式&#xff08;CQRS&#xff09;核心对象IMeditatorIRequese、IRequestIRequestHandler<in TRequest, TResponse>源码链接&#xff1a;https://github.com/witskeeper/geektime/tree/master/samples/MediatorDemo首先…

十一届蓝桥杯国赛 玩具蛇-dfs

【问题描述】 小蓝有一条玩具蛇&#xff0c;一共有 16 节&#xff0c;上面标着数字 1 至 16。每一节都是一 个正方形的形状。相邻的两节可以成直线或者成 90 度角。 小蓝还有一个 4 4 的方格盒子&#xff0c;用于存放玩具蛇&#xff0c;盒子的方格上依次标着 字母 A 到 P 共 1…