GPL、MIT、Apache... 一文讲清楚开源协议间的区别

目录

  • 1. GPL、MIT、Apache... 一文讲清楚开源协议间的区别
    • 1.1. GPL-强制开源-linux
    • 1.2. LGPL-让公司能够拿 GPL 卖钱-Qt
    • 1.3. MIT-受公司欢迎的宽松协议-vue
    • 1.4. BSD-别借我的名气做宣传!
    • 1.5. Apache-加强法制宣传-PaddlePaddle
    • 1.6. WTFPL-我甚至不敢写全称的奇葩协议

1. GPL、MIT、Apache… 一文讲清楚开源协议间的区别

个人开发者到底选择 GPL 协议还是 MIT 协议?
为什么小米可以避开开源协议?
安卓是开源的, 为什么华为还要自己造鸿蒙?
你知道史上最奇葩的开源协议吗?

这些问题, 都将在这篇文章中找到答案。
开源, 是很多个人开发者选择的道路。

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

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

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

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

1.1. GPL-强制开源-linux

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 系统卖给别人, 当然有没有买家就另说了。

1.2. LGPL-让公司能够拿 GPL 卖钱-Qt

由于 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 中这么使用:

int main() {
    my_libA_init();
    my_libA_DoSomething();
}

那么, 你只需要开源 wrapper.cpp, 而不需要开源 main.cpp 了, 这就避免了把想要隐藏的上层逻辑开源出去, 也就能够作为商业软件卖钱了。

著名的 GUI 开发框架 Qt 使用了 LGPL 协议。

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

MIT(The Massachusetts Institute of TechnologyLicense, 麻省理工学院许可协议)是众多协议条款中, 被广泛使用的其中一种。与其他常见的软件许可协议相比, MIT 是相对宽松的软件许可协议。

MIT 协议允许你任意的使用、复制、修改原 MIT 代码库, 随便你卖钱还是开源, 唯一需要遵循的原则就是在你的软件中声明你也使用的是 MIT 协议就行了。

而很多的公司企业在选用开源产品的时候都首选 MIT 协议, 因为可以完全控制这些第三方的代码, 在必要的时候可以修改或者二次开发。

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

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

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

1.5. Apache-加强法制宣传-PaddlePaddle

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

这个特点具有两面性, 一方面, 作为个人开发者, 可以放心的使用 MIT 或 BSD 协议而不太需要担心背后的法律风险, 第二方面, 大公司在开源自己软件时, 会担心由于"过度宽松"导致产生一些法律纠纷。

因此, Apache 协议出现了。

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

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

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

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

1.6. WTFPL-我甚至不敢写全称的奇葩协议

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

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

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

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

From https://codedocs.org/what-is/wtfpl

           DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
                   Version 2, December 2004
 
Copyright (C) 2004 Sam Hocevar 

Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed.
 
           DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
  TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

 0. You just DO WHAT THE FUCK YOU WANT TO.

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

第二个奇葩点在于。

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

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

你可能感兴趣的:(miscellaneous,apache,开源协议,mit,gpl,lgpl)