在 GitHub 上浏览一些开源软件时,我们经常会看到 README.md 文件下会有一个关于 License 的声明,或者有一个单独的 LICENSE 文件来说明该软件或者类库是基于什么协议开源的,你能拿他做什么不能做什么。或许是因为习惯了在 Google 或者 Stackoverflow 上找到一份代码就开始使用的缘故,很多人不会留意这些软件是基于什么开源协议开源的。比如广泛使用的 jQuery,大家都在用,也没有任何人说直接复制了或者更改了 jQuery 源码产生衍生软件会有什么问题。但是在开发商业软件的过程中如果需要用到开源软件,它使用的何种开源协议对你的软件有直接或者致命的影响。

1 自由软件

在开始谈开源协议之前我们应该需要了解一些自由软件以及著作权相关的知识。

自由软件运动

自由软件运动(free software movement 或 free/open source software movement,简称 FSM 或 FOSSM)是一个推广用户有使用、复制、研究、修改和分发软件等权利的社会运动。接近和相关的运动包括开放源代码运动及自由软件的开放源代码运动。这运动跟 1970 年代的黑客文化有渊源,而理查德·斯托曼是该运动的主要发起人以及精神领袖。 自由软件运动人士认为自由软件的精神应当贯彻到所有软件,他们认为禁止计算机用户行使这种自由是不道德的行为。理察·马修·斯托曼认为贩卖不附带源代码的二进制软件是不道德的,因为这样阻止了软件用户学习以及帮助其他人的权利。

Copyleft

Copyleft 是一由自由软件运动所发展的概念,在自由软件许可协议方式中增加 Copyleft 条款之后,该自由软件除了允许用户自由使用、散布、改作之外,Copyleft 条款更要求用户改作后的派生作品必须要以同等的许可方式发布以回馈社区。Copyleft 的中文译法包括反版权(对照 Copyright)、公共版权。选择 Copyleft 许可方式并不代表作者放弃著作权,反而是贯彻始终,强制被授权者使用同样授权发布派生作品,Copyleft 许可条款不反对著作权的基本体制,却是通过利用著作权法来进一步地促进创作自由。

2 常见的开源协议

以下介绍在 GitHub 上使用广泛的开源协议。

MIT

MIT 协议(The MIT License)听名字就能猜测到是取自麻省理工学院(Massachusetts Institute of Technology, MIT),又称”X License“。在所有的开源协议中它可以说是一个非常宽松的协议,它只想保留版权和免责声明,没有对源码使用的限制,你可以把它的源码使用在自己的软件中,而不必强制开源自己的代码。所以商用软件可以很放心的使用这类开源项目,这也是 MIT 得于流行的原因之一。

在前端开发以及 NPM(一个 Node.js 包管理器)生态圈中的开源软件大部分都是基于 MIT 协议开源的,Web 开发生态欣欣向荣也受益于此。非常有名的 jQuery、.NET Core 以及 Rails 都是基于 MIT License。

GPL

GNU 通用公共许可协议(GNU General Public License,简称 GNU GPL、GPL)是广泛使用的免费软件许可证,可以保证终端用户得自由运行,学习,共享和修改软件。许可证最初由 GNU 项目的自由软件基金会 (FSF)的理查德·斯托曼(Richard Matthew Stallman)撰写,并授予计算机程序的收件人自由软件定义的权利。 GPL 是一个 Copyleft 许可证,这意味着派生作品只能以相同的许可条款分发具有”传染性“,GPL 是第一个普遍使用的 Copyleft 许可证。GPL 的出发点是代码开源、免费使用,但不允许修改后和衍生的代码做为闭源的商业软件发布和销售。所以在开发商用软件的时候,需要谨慎使用以 GPL License 开源的软件。有些时候我们还会看到一些软件是 GPL v2 或者 GPL v3,这些之间又有什么关系呢?

GPLv1

GPL 于 1989 年编写,提供给列入 GNU 项目的一些软件程序所使用,目标是提供一个可用于任何项目的授权证,从而使许多项目得以共享代码。其目的是防止那些阻碍自由软件的行为,而这些阻碍软件开源的行为主要有两种(一种是软件发布者只发布可执行的二进制代码而不发布具体源代码,一种是软件发布者在软件许可加入限制性条款)。因此按照 GPLv1,如果发布了可执行的二进制代码,就必须同时发布可读的源代码,并且在发布任何基于 GPL 许可的软件时,不能添加任何限制性的条款

GPLv2

在 GPLv2 中所做的最大的改动就是增加了“自由还是死亡”(Liberty or Death)条款,被许可人只有在满足所有许可证的义务下才可以分发包含 GPL 授权的软件,尽管他们可能拥有任何其他法律义务。 换句话说,就算有相互矛盾的义务,许可证的义务也可能不被切断。该条款旨在阻止任何一方使用专利侵权索赔或其他诉讼来损害用户在许可证下的自由。这章中的意思是,为了在一定程度上保障和尊重其它一些人的自由和权益,无论任何人要发布源于 GPL 的软件的时候,同时也须遵守强制的条款分享源代码,否则他将根本无权发布该软件。(因为在一些国家里,人们只能以二进制代码的形式发布软件,以保护开发软件者的版权。)

GPLv3

理查德·斯托曼(Richard Stallman)起草了第一份 GNU GPLv3 草案,在美国麻州剑桥市的 MIT 大学。 到 2005 年,GPL 版本 3 正由斯托曼起草,由伊本·莫格林和软件自由法律中心(Software Freedom Law Center) 提供法律咨询。

在所有的改动中,最重要的四个是:

  • 解决软件专利问题;
  • 与其他许可证的兼容性;
  • 源代码分区和组成的定义;
  • 解决数位版权管理(DRM) 问题。

GPLv3 提高了与许多开放源代码软件许可证(如 Apache 许可证版本 2.0)和 GNU Affero 通用公共许可证(GPLv2 无法组合)的兼容性。

使用 GPL License 的代表 Linux(GPL v2)也就是说其他衍生的发行版本也是使用该许可证。

Apache

Apache 许可证(Apache License),是一个由 Apache 软件基金会发布的自由软件许可证,最初为 Apache http 服务器而撰写。Apache 许可证要求被授权者保留版权和放弃权利的声明,但它不是一个 Copyleft 的许可证。 此许可证最新版本为“版本 2”,于 2004 年 1 月发布。 Apache 许可证在 Apache 社区内外被广泛使用。Apache 基金会下属所有项目都使用 Apache 许可证,许多非 Apache 基金会项目也使用了 Apache 许可证。

使用 Apache License 的代表 Android、Apache、Swift。

BSD

BSD 许可证(Berkeley Software Distribution license)跟其他许可证相比,从 GNU 通用公共许可证(GPL)到限制重重的著作权(Copyright),BSD 许可证比较宽松,甚至跟公有领域更为接近。事实上,BSD 许可证被认为是 Copycenter(中间版权),介乎标准的 Copyright 与 GPL 的 Copyleft 之间。可以说,GPL 强迫后续版本必须一样是自由软件,BSD 的后续版本可以选择要继续是 BSD 或其他自由软件条款或封闭软件等等。BSD 鼓励代码共享,但需要尊重代码作者的著作权。BSD 由于允许使用者修改和重新发布代码,也允许使用或在 BSD 代码上开发商业软件发布和销售,因此是对商业集成很友好的协议。

使用 BSD 的代表 React Native。

Mozilla

Mozilla Public License(MPL 2.0)是由 Mozilla 基金创建维护的。此协议旨在较为宽松的 BSD 协议和更加严格的 GPL 协议中寻找一个折中。

使用 Mozilla 的代表 Servo、Syncthing。

除了这些常见的开源协议,还有一些恶搞或者小众的 License 受到部分程序员的青睐,比如 WTFPL(Do What the Fuck You Want to Public License)其名字已经诠释了该 License 的主要内容。

3 如何选择一个开源协议

一张图应该够了

乌克兰程序员 Paul Bagwell,画了一张分析图,阮一峰 老师做了一个中文版。

GitHub 帮你选择

GitHub 做了一个网站帮助开发者选择自己适合的开源协议 https://choosealicense.com/