开源生态|GPL、MIT、Apache...开发者如何选择开源协议(一文讲清根本区别)

个人开发者到底选择GPL协议还是MIT协议?
为什么小米可以避开开源协议?
安卓是开源的,为什么华为还要自己造鸿蒙?
你知道史上最奇葩的开源协议吗?
这些问题,都将在这篇文章中找到答案。
目录
GPL-强制开源
LGPL-让公司能够白嫖代码卖钱
MIT-受公司欢迎的宽松协议
BSD-别借我的名气做宣传!
Apache-避免法律纠纷
WTFPL-我不敢写全称的奇葩协议
开源,是很多个人开发者选择的道路。
开源不仅能够帮助整个生态共同进步,也能够帮助个人开发者提升技术和名气,这一点从vue就能看出来。
开源生态|GPL、MIT、Apache...开发者如何选择开源协议(一文讲清根本区别)
文章图片

但是,开源的意思并不是没有规则,全部无条件的免费提供给别人用,必须要遵循一定的规则,这个规则就是开源协议(Open Source License)。
世界上的开源协议大概有上百种,但是常用的只有5、6种,网络上的很多文章只是笼统的介绍,并没有说清楚这些协议的关键区别,以及每种协议对开发者的好处和限制。
开源生态|GPL、MIT、Apache...开发者如何选择开源协议(一文讲清根本区别)
文章图片

为了帮助开发者区别这些协议,这篇文章对常见的几种协议进行介绍,包括需要遵循的原则以及目前使用这些协议的代码库。

GPL-强制开源
GPL(GNU General Public License):GNU通用公共许可协议。
GPL协议的目的就是强制代码开源和免费使用。
其最大的特点就是“开源的传染性”。也就是说,假设某公司使用了具有GPL协议的代码库,那么他理论上也必须把自己的代码库开源。
注意,这里是理论上。
实际上,大公司可以有很多方法避开这个限制。
比如,2015年的时候,小米被指责违反了GPL协议,MIUI系统是基于Android开发的,而内核Linux遵循的是GPL协议,那么小米也必须对自己的MIUI系统进行开源。
开源生态|GPL、MIT、Apache...开发者如何选择开源协议(一文讲清根本区别)
文章图片

但是小米方面给出的答复是“很快就会开源”。这个很快,就慢慢拖着,反正我也不否认未来会开源。
另外,大公司还会选择为自己维护一套闭源的商业代码。
比如最著名的AOSP (Android Open-Source Project) 和Android。
AOSP是开源的安卓系统,而Android这个词已经变成了谷歌的一个商标,以及附加了GMS等一些软件的大系统。
开源生态|GPL、MIT、Apache...开发者如何选择开源协议(一文讲清根本区别)
文章图片

什么意思呢,我们认为开源的那套系统,实际上就像一个毛坯房,而真正附加了谷歌全家桶等软件的Android,是精装房,精装的部分是不开源的。
所以华为一定要自己基于AOSP开发一套操作系统,你要不这么干的话,只要谷歌禁止你使用Android,马上就死。
说个笑话,GPL协议没有限制你卖钱。
也就是说理论上,你可以把原汁原味的开源linux系统卖给别人,当然有没有买家就另说了。
开源生态|GPL、MIT、Apache...开发者如何选择开源协议(一文讲清根本区别)
文章图片



LGPL-让公司能够白嫖代码卖钱
由于GPL协议的“开源传染性”,一些公司肯定无法接受将自己的代码开源出去,这还怎么赚钱呢?
于是出现了LGPL( GNU Lesser GPL),也就是限制更少(针对想闭源卖钱的公司)的GPL。
如果公司只是想白嫖某个LGPL协议的代码库,而不需要对其及进行修改,那就可以使用此协议。
开源生态|GPL、MIT、Apache...开发者如何选择开源协议(一文讲清根本区别)
文章图片

具体来说就是。
如果使用动态链接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-受公司欢迎的宽松协议 【开源生态|GPL、MIT、Apache...开发者如何选择开源协议(一文讲清根本区别)】
MIT(The Massachusetts Institute of TechnologyLicense,麻省理工学院许可协议)是众多协议条款中,被广泛使用的其中一种。与其他常见的软件许可协议相比,MIT是相对宽松的软件许可协议。
MIT协议允许你任意的使用、复制、修改原MIT代码库,随便你卖钱还是开源,唯一需要遵循的原则就是在你的软件中声明你也使用的是MIT协议就行了。
而很多的公司企业在选用开源产品的时候都首选MIT协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。
开源生态|GPL、MIT、Apache...开发者如何选择开源协议(一文讲清根本区别)
文章图片

UI框架VUE、脚本语言Lua使用的就是MIT协议。


BSD-别借我的名气做宣传!
BSD协议几经变种,和MIT协议区别已经不大,唯一的小区别是BSD要求开发者不能利用前人的名义做宣传。比如我不能以某某升级版,某某加强版的名义来宣传我的软件。


Apache-避免法律纠纷
MIT和BSD协议有一个特点:简洁。
这个特点具有两面性。
一方面,作为个人开发者,可以放心的使用MIT或BSD协议而不太需要担心背后的法律风险。
另一方面,大公司在开源自己软件时,会担心由于“过度宽松”导致产生一些法律纠纷。
因此,Apache协议出现了。
在保持较为宽松的开源基础上,加上了一些避免法律冲突的限制。
比如,要求在每个许可文件中,必须保留再分发代码中的任何原始著作权、专利、商标等。
因此,大公司往往倾向于使用Apache协议而不是稍微模糊的MIT协议。
百度的深度学习框架PaddlePaddle使用了Apache协议。
开源生态|GPL、MIT、Apache...开发者如何选择开源协议(一文讲清根本区别)
文章图片



WTFPL-我不敢写全称的奇葩协议
如果你觉得上面的协议没一个自由的,你崇尚绝对的自由开源,那么这条协议就太适合你了。
WTFPL协议是目前最奇葩的协议,奇葩在两点。
第一点是,这个协议实际上没有任何内容,这里是这个协议的内容。
开源生态|GPL、MIT、Apache...开发者如何选择开源协议(一文讲清根本区别)
文章图片

鉴于这里面敏感词太多我就不逐字翻译了。
大致意思就是:你想干什么就干什么吧,你可以随便改代码,你也可以随便改协议内容,。
第二个奇葩点在于。
这个协议是已经被认证了的协议......
你敢相信,这个奇葩协议是一个正儿八经的正规军。

现在,你搞清楚不同开源协议之间的区别了吗?

    推荐阅读