GPL、MIT、Apache...开发者如何选择开源协议?一文讲清根本区别

个人开发者到底选择GPL协议还是MIT协议?

为什么小米可以避开开源协议?

安卓是开源的,为什么华为还要自己造鸿蒙?

你知道史上最奇葩的开源协议吗?

这些问题,都将在这篇文章中找到答案。

目录

GPL-强制开源

LGPL-让公司能够白嫖代码卖钱

MIT-受公司欢迎的宽松协议

BSD-别借我的名气做宣传!

Apache-避免法律纠纷

WTFPL-我不敢写全称的奇葩协议


开源,是很多个人开发者选择的道路。

开源不仅能够帮助整个生态共同进步,也能够帮助个人开发者提升技术和名气,这一点从vue就能看出来。

GPL、MIT、Apache...开发者如何选择开源协议?一文讲清根本区别_第1张图片

但是,开源的意思并不是没有规则,全部无条件的免费提供给别人用,必须要遵循一定的规则,这个规则就是开源协议(Open Source License)。

世界上的开源协议大概有上百种,但是常用的只有5、6种,网络上的很多文章只是笼统的介绍,并没有说清楚这些协议的关键区别,以及每种协议对开发者的好处和限制。

GPL、MIT、Apache...开发者如何选择开源协议?一文讲清根本区别_第2张图片

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

GPL-强制开源

GPL(GNU General Public License):GNU通用公共许可协议。

GPL协议的目的就是强制代码开源免费使用

其最大的特点就是“开源的传染性”。也就是说,假设某公司使用了具有GPL协议的代码库,那么他理论上也必须把自己的代码库开源。

注意,这里是理论上。

实际上,大公司可以有很多方法避开这个限制。

比如,2015年的时候,小米被指责违反了GPL协议,MIUI系统是基于Android开发的,而内核Linux遵循的是GPL协议,那么小米也必须对自己的MIUI系统进行开源。

GPL、MIT、Apache...开发者如何选择开源协议?一文讲清根本区别_第3张图片

但是小米方面给出的答复是“很快就会开源”。这个很快,就慢慢拖着,反正我也不否认未来会开源。

另外,大公司还会选择为自己维护一套闭源的商业代码。

比如最著名的AOSP (Android Open-Source Project) 和Android。

AOSP是开源的安卓系统,而Android这个词已经变成了谷歌的一个商标,以及附加了GMS等一些软件的大系统。

GPL、MIT、Apache...开发者如何选择开源协议?一文讲清根本区别_第4张图片

什么意思呢,我们认为开源的那套系统,实际上就像一个毛坯房,而真正附加了谷歌全家桶等软件的Android,是精装房,精装的部分是不开源的。

所以华为一定要自己基于AOSP开发一套操作系统,你要不这么干的话,只要谷歌禁止你使用Android,马上就死。

说个笑话,GPL协议没有限制你卖钱。

也就是说理论上,你可以把原汁原味的开源linux系统卖给别人,当然有没有买家就另说了。

GPL、MIT、Apache...开发者如何选择开源协议?一文讲清根本区别_第5张图片

LGPL-让公司能够白嫖代码卖钱

由于GPL协议的“开源传染性”,一些公司肯定无法接受将自己的代码开源出去,这还怎么赚钱呢?

于是出现了LGPL( GNU Lesser GPL),也就是限制更少(针对想闭源卖钱的公司)的GPL。

如果公司只是想白嫖某个LGPL协议的代码库,而不需要对其及进行修改,那就可以使用此协议。

GPL、MIT、Apache...开发者如何选择开源协议?一文讲清根本区别_第6张图片

具体来说就是。

如果使用动态链接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协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。

GPL、MIT、Apache...开发者如何选择开源协议?一文讲清根本区别_第7张图片

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

BSD-别借我的名气做宣传!

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

Apache-避免法律纠纷

MIT和BSD协议有一个特点:简洁

这个特点具有两面性。

一方面,作为个人开发者,可以放心的使用MIT或BSD协议而不太需要担心背后的法律风险。

另一方面,大公司在开源自己软件时,会担心由于“过度宽松”导致产生一些法律纠纷。

因此,Apache协议出现了。

在保持较为宽松的开源基础上,加上了一些避免法律冲突的限制。

比如,要求在每个许可文件中,必须保留再分发代码中的任何原始著作权、专利、商标等

因此,大公司往往倾向于使用Apache协议而不是稍微模糊的MIT协议。

百度的深度学习框架PaddlePaddle使用了Apache协议。

GPL、MIT、Apache...开发者如何选择开源协议?一文讲清根本区别_第8张图片

WTFPL-我不敢写全称的奇葩协议

如果你觉得上面的协议没一个自由的,你崇尚绝对的自由开源,那么这条协议就太适合你了。

WTFPL协议是目前最奇葩的协议,奇葩在两点。

第一点是,这个协议实际上没有任何内容,这里是这个协议的内容。

GPL、MIT、Apache...开发者如何选择开源协议?一文讲清根本区别_第9张图片

鉴于这里面敏感词太多我就不逐字翻译了。

大致意思就是:你想干什么就干什么吧,你可以随便改代码,你也可以随便改协议内容,。

第二个奇葩点在于。

这个协议是已经被认证了的协议......

你敢相信,这个奇葩协议是一个正儿八经的正规军。

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

你可能感兴趣的:(开源生态,harmonyos,linux,开源协议,GPL,mit)