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

做好一个开源项目其实是一件比较费时费力费心的工作,它的最大难点除了代码维护之外,还包括后期的维护和持续的跟进。我曾经做过不少开源项目,但是坚持下来的,目前有信心能够持续维护的也只有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,一经查实,立即删除!

相关文章

量子力学问题matlab求解,一个关于量子力学中的matlab的问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼syms E U x U1 a a1 a2 k k1 k2 k3 b c d e f g h l S%其中&#xff0c;b c d e f g h l是为计算简明而引入的字符&#xff0c;S为透射系数D与反射系数R之和。Einput(请输入入射电子能量E);Uinput(请输入势垒函数U);a1input(请输入…

洛谷 P1506 拯救oibh总部-dfs染色法

题目背景 oibh总部突然被水淹没了&#xff01;现在需要你的救援…… 题目描述 oibh被突来的洪水淹没了>.<还好oibh总部有在某些重要的地方起一些围墙&#xff0c;用号表示&#xff0c;而一个封闭的号区域洪水是进不去的……现在给出oibh的围墙建设图&#xff0c;问oibh…

Abp商业版 - Identity Server模块

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

python3 beautifulsoup 表格,使用Python中的BeautifulSoup拉取特定的表数据

匿名用户下面的脚本提取数据并将数据保存到csv文件中。import requestsfrom bs4 import BeautifulSoupimport pandas as pdres requests.get(https://gol.gg/teams/list/season-ALL/split-ALL/region-ALL/tournament-LCS%20Summer%202020/week-ALL/)soup BeautifulSoup(res.t…

洛谷 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…

【要闻】VMware的双重身份曝光、Kubernetes 1.18发布

作为Kubernetes供应商&#xff0c;你该认识一下VMware的两面性2020年3月中旬&#xff0c;VMware宣布正式发布与Kubernetes相关的产品“ VMware Tanzu”。对于不使用VMware服务器虚拟化基础架构的用户组织&#xff0c;这是否有意义&#xff1f;VMware利益相关者在本公告中描述了…

php mysql unsigned,PHP MySQL 核心

MySQL 是跟 PHP 配套使用的最流行的开源数据库系统。首先&#xff0c;我们可以在浏览器输入localhost打开phpMyAdmin&#xff0c;可以直观的看到我们对数据库操作后的结果以下&#xff0c;我将全部以 面向过程 的方式来像大家讲解PHP操作SQL的过程&#xff1a;$servername &…

15个基本的C#面试问题

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

求一到n偶数和值python,几个python练习题

从python公众号里面看到了几道python的练习题&#xff0c;就拿来练练手&#xff0c;结果上手了发现自己还是特别水&#xff0c;不是很难的8道题&#xff0c;我只做出来5道&#xff0c;其中还3道题卡住了&#xff0c;边查边做的。原题链接在这里&#xff1a;http://python.jobbo…

洛谷 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;减少人力成本。这也是系统/软件存在的目的。那对于攻城狮来说…

php mvc多态实例,asp.net mvc-多态模型绑定

我花了好一天的时间来解决一个密切相关的问题的答案-尽管我不确定这是否是完全相同的问题&#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…

数字和为sum的方法数-01背包计数问题

给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。 当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。 输入描述: 输入为两行: 第一行为两个正整数n(1 ≤ n ≤ 1000)&#xff0c;sum(1 ≤ sum ≤ 1000) 第二行为n个正整数Ai…

Oracle多租户体系,Oracle12C 多租户管理

--进入cdbsqlplus /nologconn sys/sys as dba--查看数据库基本信息select name,cdb from v$database;--查看容器的相关信息select con_id,name from v$containers;--查看数据文件的路径select con_id,file_name from cdb_data_files order by 1;--显示当前连接容器信息show con…

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

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