GPL、MIT、Apache...开发者如何选择开源协议?一文讲清根本区别
个人开发者到底选择GPL协议还是MIT协议?
为什么小米可以避开开源协议?
安卓是开源的,为什么华为还要自己造鸿蒙?
你知道史上最奇葩的开源协议吗?
这些问题,都将在这篇文章中找到答案。
目录
GPL-强制开源
LGPL-让公司能够白嫖代码卖钱
MIT-受公司欢迎的宽松协议
BSD-别借我的名气做宣传!
Apache-避免法律纠纷
WTFPL-我不敢写全称的奇葩协议
开源,是很多个人开发者选择的道路。
开源不仅能够帮助整个生态共同进步,也能够帮助个人开发者提升技术和名气,这一点从vue就能看出来。
但是,开源的意思并不是没有规则,全部无条件的免费提供给别人用,必须要遵循一定的规则,这个规则就是开源协议(Open Source License)。
世界上的开源协议大概有上百种,但是常用的只有5、6种,网络上的很多文章只是笼统的介绍,并没有说清楚这些协议的关键区别,以及每种协议对开发者的好处和限制。
为了帮助开发者区别这些协议,这篇文章对常见的几种协议进行介绍,包括需要遵循的原则以及目前使用这些协议的代码库。
GPL-强制开源
GPL(GNU General Public License):GNU通用公共许可协议。
GPL协议的目的就是强制代码开源和免费使用。
其最大的特点就是“开源的传染性”。也就是说,假设某公司使用了具有GPL协议的代码库,那么他理论上也必须把自己的代码库开源。
注意,这里是理论上。
实际上,大公司可以有很多方法避开这个限制。
比如,2015年的时候,小米被指责违反了GPL协议,MIUI系统是基于Android开发的,而内核Linux遵循的是GPL协议,那么小米也必须对自己的MIUI系统进行开源。
但是小米方面给出的答复是“很快就会开源”。这个很快,就慢慢拖着,反正我也不否认未来会开源。
另外,大公司还会选择为自己维护一套闭源的商业代码。
比如最著名的AOSP (Android Open-Source Project) 和Android。
AOSP是开源的安卓系统,而Android这个词已经变成了谷歌的一个商标,以及附加了GMS等一些软件的大系统。
什么意思呢,我们认为开源的那套系统,实际上就像一个毛坯房,而真正附加了谷歌全家桶等软件的Android,是精装房,精装的部分是不开源的。
所以华为一定要自己基于AOSP开发一套操作系统,你要不这么干的话,只要谷歌禁止你使用Android,马上就死。
说个笑话,GPL协议没有限制你卖钱。
也就是说理论上,你可以把原汁原味的开源linux系统卖给别人,当然有没有买家就另说了。
LGPL-让公司能够白嫖代码卖钱
由于GPL协议的“开源传染性”,一些公司肯定无法接受将自己的代码开源出去,这还怎么赚钱呢?
于是出现了LGPL( GNU Lesser GPL),也就是限制更少(针对想闭源卖钱的公司)的GPL。
如果公司只是想白嫖某个LGPL协议的代码库,而不需要对其及进行修改,那就可以使用此协议。
具体来说就是。
如果使用动态链接LGPL代码库,则你不需要开源。
如果使用静态链接,则你可以通过封装一层的方式避免开源,可以简单理解为只需要开源直接调用LGPL库的那部分代码就可以了。
是不是有些难以理解,没关系,我们举个例子。
假设有一个LGPL库,名为LibA,现在你在源文件main.cpp中使用了此库,如下:
int main() {LibA.init();LibA.DoSomething();
}
按照LGPL协议,你的这个源文件必须要开源,因为它直接调用了LibA的代码。
如何避免呢?封装!
你再写一个封装文件wrapper.cpp,如下:
void my_libA_init() {LibA.init();
}
void my_libA_DoSomething() {LibA.DoSomething();
}
接下来,在你的main.cpp中调用你的封装文件,相当于间接调用LibA:
int main() {my_libA_init();my_libA_DoSomething();
}
那么,你只需要开源wrapper.cpp,而不需要开源main.cpp了,这样就可以隐藏上层逻辑,也就能够作为商业软件卖钱了。
著名的GUI开发框架Qt使用了LGPL协议。
MIT-受公司欢迎的宽松协议
MIT(The Massachusetts Institute of TechnologyLicense,麻省理工学院许可协议)是众多协议条款中,被广泛使用的其中一种。与其他常见的软件许可协议相比,MIT是相对宽松的软件许可协议。
MIT协议允许你任意的使用、复制、修改原MIT代码库,随便你卖钱还是开源,唯一需要遵循的原则就是在你的软件中声明你也使用的是MIT协议就行了。
而很多的公司企业在选用开源产品的时候都首选MIT协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。
UI框架VUE、脚本语言Lua使用的就是MIT协议。
BSD-别借我的名气做宣传!
BSD协议几经变种,和MIT协议区别已经不大,唯一的小区别是BSD要求开发者不能利用前人的名义做宣传。比如我不能以某某升级版,某某加强版的名义来宣传我的软件。
Apache-避免法律纠纷
MIT和BSD协议有一个特点:简洁。
这个特点具有两面性。
一方面,作为个人开发者,可以放心的使用MIT或BSD协议而不太需要担心背后的法律风险。
另一方面,大公司在开源自己软件时,会担心由于“过度宽松”导致产生一些法律纠纷。
因此,Apache协议出现了。
在保持较为宽松的开源基础上,加上了一些避免法律冲突的限制。
比如,要求在每个许可文件中,必须保留再分发代码中的任何原始著作权、专利、商标等。
因此,大公司往往倾向于使用Apache协议而不是稍微模糊的MIT协议。
百度的深度学习框架PaddlePaddle使用了Apache协议。
WTFPL-我不敢写全称的奇葩协议
如果你觉得上面的协议没一个自由的,你崇尚绝对的自由开源,那么这条协议就太适合你了。
WTFPL协议是目前最奇葩的协议,奇葩在两点。
第一点是,这个协议实际上没有任何内容,这里是这个协议的内容。
鉴于这里面敏感词太多我就不逐字翻译了。
大致意思就是:你想干什么就干什么吧,你可以随便改代码,你也可以随便改协议内容,。
第二个奇葩点在于。
这个协议是已经被认证了的协议......
你敢相信,这个奇葩协议是一个正儿八经的正规军。
现在,你搞清楚不同开源协议之间的区别了吗?
GPL、MIT、Apache...开发者如何选择开源协议?一文讲清根本区别相关推荐
- GPL、MIT、Apache...开发者如何选择开源协议?一文讲清根本区别!
个人开发者到底选择GPL协议还是MIT协议? 为什么小米可以避开开源协议? 安卓是开源的,为什么华为还要自己造鸿蒙? 你知道史上最奇葩的开源协议吗? 这些问题,都将在这篇文章中找到答案. 开源,是很多 ...
- 开源协议有哪些?如何选择开源协议?
开源软件在追求"自由"的同时,不能牺牲程序员的利益,否则将会影响程序员的创造激情,因此世界上现在有 60 多种被开源促进组织(Open Source Initiative)认可的开 ...
- java license 开源_MinIO:一个基于Apache License v2.0开源协议的对象存储服务
MinIO Quickstart Guide--快速入门 MinIO 是一个基于Apache License v2.0开源协议的对象存储服务.它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构 ...
- 一文讲清如何正确选择图表,学会后再也不会用错图表
在工作中会发现很多人在做图表的时候,最容易出现错误的地方不是在对数据的处理上,而是在对图表的选择上.图表种类如此之多,什么场景下用什么图表展示最合适,确实是一个难题,一旦用了不合适的图表来表达数据,反 ...
- 【开源协议】关于6种开源协议的说明(GPL,LGPL,BSD,MIT,Apache)
关于开源协议的说明 前言 开源协议分为 宽松型 和 著作权型. 如何选择? 开源协议(GPL,LGPL,BSD,MIT,Apache)的说明 1. GPL 2.LGPL 3. BSD开源协议 4.MI ...
- VNPY官方开源项目为什么不能选择MIT开源协议
其他文章 <VNPY项目开源地址> https://gitcode.net/vnpy/vnpy <vnpy3.0新版策略自动生成回测文件功能代码解析> 众所周知,VNPY是采用 ...
- 开源协议是什么?有哪些?如何选择?
开源软件在追求"自由"的同时,不能牺牲程序员的利益,否则将会影响程序员的创造激情,因此世界上现在有 60 多种被开源促进组织(Open Source Initiative)认可的开 ...
- 【全】可供选择的软件开源协议的罗列
Public License List 罗列各种开源代码的公共协议以供选择.具体每一个协议的含义可以另外找教程文章或看官网原文,这里解决"都有什么"的问题. List of lic ...
- 从Facebook的React框架事件学习一下开源协议
前言 前一阵子由于Facebook BSD+PATENTS License的原因,Apache项目禁止使用带该license的代码,引人注目的就是Facebook的React前端框架. 后来在知乎上看 ...
最新文章
- 回归——同步更新github.io
- 【代码笔记】iOS-长条label
- 广西2021各校高考成绩查询入口,2021年广西高考成绩排名查询系统,广西高考位次排名查询...
- matlab绘制立体图
- java开发分支_如何选择Java 的分支?
- 数据大牛都在啃的10本书
- zklib php,php 安装zookeeper扩展报错
- 用Python爬数据,FineBI做分析后,我发现淘宝的手机原来这么便宜
- java list 某个重复列_Java 开发的编程噩梦,这些坑你没踩过算我输
- 看拉扎维《模拟CMOS集成电路设计》的一些总结和思考(三)——单级放大器
- excel数据分析 - 13个图表可视化技巧
- 瞬息万变的技术圈与焦虑的技术人,进阶Android需要掌握的那几个关键技术!
- 2022年中职组“网络安全”赛项湖南省任务书
- 台式计算机没有任务栏,台式电脑没有声音该怎么办
- 无人机石油巡线技术方案
- 计算机二级本科免修,计算机二级证书可以免考自考的哪些科目?
- 2019年985院校计算机专业排名,2019年985大学名单排名,985大学详解(附全榜单)
- flickr app android,Flickr latest Android app(Version: 2.1.5) ContentProvider security issue
- 基于Abaqus的UMATHT子程序进行非傅里叶热传导分析
- CLTWORKINGDIR”的指定目录The Specified Directory ‘D:\Program File