82天突破1000star,项目团队梳理出软件开源必须注意的8个方面
创始人
2025-03-17 17:21:35
0次

近期,我们在GitHub上开源了微服务任务调度框架SIA-TASK,82天,收获了1000+个star!由于这是SIA团队第一次开源项目,开源的相关工作,团队之前并没有太多的经验,因此我们特别整理了本次开源的各种记录事项,希望给今后开源的项目做参考。 

一、开发

在开源项目的开发过程中要注意以下几点:

  • 首先,要给自己的项目取一个合适的名字,取名规则这里不再赘述,需要强调的一点是:项目名称不能与GitHub上已开源过的项目名称相同。
  • 其次,选择合适的编程语言。
  • 再次,编码过程中要注意代码的规范。

最后要说的就是开源协议的选择了,目前最流行的开源协议有以下六种:GPL、BSD、MIT、Mozilla、Apache和LGPL。

不同的开源协议之间的差别还是挺大的,具体如何选择,可以参考一张图看懂开源协议(https://blog.csdn.net/cwt19902010/article/details/53736746),如果这些常用的开源协议都不适合你的项目,你也可以自己写一个自己的开源协议。

为了更方便查看开源协议选择图,参考图如下:

82天突破1000star,项目团队梳理出软件开源必须注意的8个方面

以Apache License Version 2.0协议为例,比较常用协议与Apache协议冲突情况,冲突图如下:

82天突破1000star,项目团队梳理出软件开源必须注意的8个方面

二、协议

项目开发完成之后,需要梳理出项目中使用到的协议(包含项目引用的组件中用到的协议),此处推荐使用maven许可证插件。插件配置参见License Maven Plugin(https://www.mojohaus.org/license-maven-plugin/),maven许可证插件在主pom中配置示例如下(此处开源协议采用Apache 2.0)

  1.   
  2.       
  3.           
  4.             Apache License, Version 2.0  
  5.             http://www.apache.org/licenses/LICENSE-2.0.html  
  6.             repo  
  7.           
  8.       
  9.   
  10.       
  11.            
  12.              org.codehaus.mojo  
  13.              license-maven-plugin  
  14.              1.13  
  15.                
  16.                    
  17.                  ${main.basedir}  
  18.                  LICENSE-3RD-PARTY  
  19.                  /org/codehaus/mojo/license/third-party-file-groupByLicense.ftl  
  20.                  true  
  21.                  ${main.basedir}/LICENSE-3RD-PARTY.properties  
  22.                  ${main.basedir}/LICENSE-3RD-PARTY.properties  
  23.                    
  24.                      Apache 2.0|ASL, version 2|http://www.apache.org/licenses/LICENSE-2.0.txt|http://asm.ow2.org/license.html|The Apache License, Version 2.0|Apache License|Apache License Version 2|Apache License Version 2.0|Apache Software License - Version 2.0|Apache 2.0 License|Apache License 2.0|ASL|Apache 2|Apache-2.0|the Apache License, ASL Version 2.0|The Apache Software License, Version 2.0|Apache License, Version 2.0|Apache Public License 2.0  
  25.                      BSD|The BSD 3-Clause License|The BSD License|Modified BSD License|New BSD License|New BSD license|Two-clause BSD-style license|BSD licence|BSD New|The New BSD License|BSD 3-Clause|BSD 3-clause  
  26.                      MIT|MIT License|The MIT License  
  27.                      LGPL|LGPL, version 2.1|GNU Library or Lesser General Public License (LGPL) V2.1|GNU Lesser General Public License (LGPL), Version 2.1|GNU Lesser General Public License, Version 2.1|LGPL 2.1  
  28.                      CDDL|CDDL+GPL|CDDL+GPL License|CDDL + GPLv2 with classpath exception|CDDL License|CDDL 1.0|CDDL 1.1|COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0|Common Development and Distribution License (CDDL) v1.0  
  29.                      EPL|Eclipse Public License - Version 1.0  
  30.                      GPL|GPL2 w/ CPE|GPLv2+CE|GNU General Public Library  
  31.                      MPL|MPL 1.1  
  32.                      Public Domain  
  33.                      Common Public License|Common Public License Version 1.0  
  34.                      CC0|CC0 1.0 Universal|Public Domain, per Creative Commons CC0  
  35.                      Unknown License|Unknown license  
  36.                    
  37.   
  38.                    
  39.                  true  
  40.                    
  41.                  ${main.basedir}/lic/licenses.xml  
  42.                  ${main.basedir}/lic/licenses/  
  43.   
  44.                    
  45.                  apache_v2  
  46.                  2019  
  47.                  sia  
  48.                  task  
  49.                    
  50.                      src/main/java  
  51.                      src/test/java  
  52.                    
  53.                    
  54.                      **/*.java  
  55.                      **/*.xml  
  56.                      **/*.sh  
  57.                      **/*.py  
  58.                      **/*.properties  
  59.                      **/*.sql  
  60.                      **/*.html  
  61.                      **/*.less  
  62.                      **/*.css  
  63.                      **/*.js  
  64.                      **/*.json  
  65.                    
  66.                  true  
  67.                  true  
  68.                  false  
  69.                  true  
  70.                  <<  
  71.                  >>  
  72.                  ==  
  73.   
  74.                    
  75.                  ${main.basedir}/LICENSE  
  76.                
  77.            
  78.            
  79.              org.jasig.maven  
  80.              maven-notice-plugin  
  81.              1.0.6.1  
  82.                
  83.                  false  
  84.                  https://source.jasig.org/licenses/NOTICE.template  
  85.                    
  86.                      https://source.jasig.org/licenses/license-mappings.xml  
  87.                    
  88.                
  89.            
  90.        

配置完成之后,执行如下命令即可生成相应的协议到对应的文件,命令如下:

  1. #### Updates (or creates) the main project license file according to the license defined in the licenseName parameter. 
  2. `mvn license:update-project-license` 
  3.  
  4. #### Generates a file containing a list of all dependencies and their licenses for a multi-module build. 
  5. `mvn license:aggregate-add-third-party` 
  6.  
  7. #### Downloads the license files associated with each dependency for a multi-modules build. 
  8. `mvn license:aggregate-download-licenses` 
  9.  
  10. #### Generate NOTICE? 
  11. `mvn notice:generate` 

项目开源时,需要在源文件的顶部添加一个保护许可,修改、检查、删除源文件头部保护许可命令如下:

  1. #### how to generate/update source code header? 
  2. ## Updates the license header of the current project source files. 
  3. mvn license:update-file-header 
  4. ## Checks the license header of the current project source files. 
  5. mvn license:check-file-header 
  6. ## Remove any license header of the current project source files. 
  7. mvn license:remove-file-header 

执行完上述命令之后,会生成几个协议文件,其中有两个关键的文件:

  1. LICENSE文件:存放当前开源项目中用到的开源协议信息。
     
  2. LICENSE-3RD-PARTY文件:组件使用到的协议。
     

在LICENSE-3RD-PARTY文件中查看组件使用的协议,参考前面介绍的各协议冲突情况,查看看组件中用到的协议是否与当前开源项目选择的开源协议有冲突,如果有冲突,需要替换掉协议冲突的接口。 

三、安全扫描 

 

 

安全扫描是项目开源流程中必不可少的一步,安全扫描关注的点主要有以下几个:

 

  • 组件层面安全问题。比如:组件是否存在远程代码执行风险、XXE风险等。 
  • 代码层面安全问题。比如:RequestMapping上请求未限制方法等。 
  • 公司敏感信息是否外泄。比如:数据库连接信息、邮箱信息等被暴露。

备注:安全扫描工作由安全部·安全服务团队的同事负责完成,项目开发完成之后,可联系安全服务团队的同事进行代码安全扫描工作。
四、文档 

 

README文档相当于开源项目的一个门面,如果README文档写得好,能够让用户更了解开源项目的功能,减少用户的使用成本。可以说README文档写得好的开源项目不一定是好的开源项目,但是好的开源项目的README文档写得一定好。
下面简单介绍下README文档的编写规范。综合GitHub上很多大型开源项目的README文档,个人认为READEME文档主要由以下几部分组成:
1)项目介绍
项目介绍是为了让别人快速了解项目。主要内容包括项目背景、项目简介。
2)项目架构
项目架构主要介绍项目的实现方式,可以让用户更了解项目的实现原理。 
3)项目集成方式 
项目集成方式即项目开发指南,可以列出项目的部署方式,或者是jar包的使用方式。
4)项目使用指南
项目使用指南也就是告诉用户怎么使用项目。最好是附上每一步的使用截图信息,这样能减少后期跟用户之间的沟通成本。
5)版本说明
此处需要告诉用户使用哪个版本更稳定。
6)版权说明
版权信息可以用于作者的维权,保护作者版本信息的合法权益。
7)项目交流方式
项目交流方式部分可以留下开源作者或者是组织的微信、微博、邮箱等联系方式,方便用户与开源作者进一步技术沟通。
五、版本 

 

 

GitHub上开源的项目需要有个版本号,版本格式为:主版本号.次版本号.修订号,版本号递增规则如下:

 

  • 主版本号:当你做了不兼容的 API 修改; 
  • 次版本号:当你做了向下兼容的功能性新增;
  • 修订号:当你做了向下兼容的问题修正。

 先行版本号及版本编译元数据可以加到“主版本号.次版本号.修订号”的后面,作为延伸。

 

更形象的解释如下:标准的版本号必须采用 X.Y.Z 的格式,其中 X、Y 和 Z 为非负的整数,且禁止在数字前方补零。X 是主版本号、Y 是次版本号、而 Z 为修订号。每个元素必须以数值来递增。例如:1.9.1 -> 1.10.0 -> 1.11.0。
备注:开源版本规范引自GitHub命名规范:语义化版本2.0.0:https://semver.org/lang/zh-CN/

 

六、开源

做完上述几步的工作之后,我们就可以把项目上传到GitHub上进行开源了。GitHub的使用网上有很多文章介绍,这里不再赘述,可以参考 在GitHub上参与开源项目日常流程:https://blog.csdn.net/five3/article/details/9307041

七、后期

开源后期维护服务是开源项目时最容易被忽视的,为了让用户更好地使用开源项目,我们可以通过GitHub issue、微信答疑群、论坛、社区文章分享等互动形式做好开源后期服务工作。

八、迭代

GitHub上迭代开发流程如下:项目owner给项目开发者设置member权限,member用户fork开源项目的资源成自己的资源,然后修改fork之后的资源,修改完成之后,提merge请求,只有项目owner才有权限merge。如何同步fork项目可参见如下文章如何同步fork项目:https://blog.csdn.net/t111t/article/details/45894381 

 

 

开源项目:
微服务任务调度框架 :https://github.com/siaorg/sia-task

 

 

 

微服务路由网关 :https://github.com/siaorg/sia-gateway

 

 

 

【本文是51CTO专栏机构宜信技术学院的原创文章,微信公众号“宜信技术学院( id: CE_TECH)”】

 

 

 

 

 

 

 

 

 

 

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
只需三步,让你掌握阿尔法路由器... 请参照以下阿尔法路由器设置方法,通过浏览器进入及设置宽带路由器。经过这三个步骤的设置,基本上能够熟悉...
如何更省钱? 近期特价热门硒鼓... 如今激光打印设备已经成为商务或企业的绝对主力办公设备,但采购者往往忽视了激光打印设备所用的耗材,相对...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...