如何选择和使用开源许可协议

前言

         昨晚在 Github 上新建仓库的时候,突然卡在一个以往没有多大注意的地方:

         是的,就是卡在不知道如何选择一个合适的 License。数了一下,Github 提供了 15 种 Licenses 给用户选择,看着这些选项的名字,倒并不觉得陌生,毕竟平时接触代码多少也有看过相关的 License,但尴尬的是,它们之间有什么区别我还真不太了解。因此,借此机会,给自己扫盲的同时,顺便写一篇博客,记录一下自己的理解。

什么是开源许可协议

         开源许可协议(Open-source license)是计算机软件的版权许可协议,其使源代码可用在允许修改和重分发而不要向原始创建者付费的条件下。这些许可协议可能有额外的限制例如需要保留原创者的名字和代码内的版权状态。一个开源许可协议通常是被基于它们开源定义(OSD)的开放源码促进会(OSI)所认可的。
         不得不说,如今存在的开源许可协议数量真的是十分庞大。在 GNU 的一篇文章「Various Licenses and Comments about Them」中,介绍了各种各样不同种类的开源许可协议,粗略估计了一下,大概有上百种,实在令人大开眼界。

主流的开源许可协议

         如此庞大的数目,我想我不可能况且也没必要一一细讲,所以接下来我主要是讲几款主流的开源许可协议,如MIT、BSD、GPL、LGPL 与 Apache 许可协议。

MIT

         MIT许可协议(The MIT License)是被广泛使用的开源许可协议之一,其名源自麻省理工学院(Massachusetts Institute of Technology, MIT),又称「X许可协议」(X License)或「X11许可协议」(X11 License)。

         MIT 许可协议内容十分简短,而且限制条款也十分宽松,声明原文如下:

The MIT License (MIT)
Copyright (c) [year] [copyright holders]

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

         部分内容翻译过来便是:

该许可免费授予任何获得本软件及相关文档(合称为「软件包」)的人,许可他可以无限制地应用软件,包括不受限地使用、拷贝、修改、合并、出版、分发、再授权、和/或出售软件的拷贝。

被许可者获取软件包提供的权利必须基于以下条件:

以上版权声明和本许可声明必须包含在软件包的全部拷贝或实质性部分中。

         对于使用者来说,这意味着:

  • 可以任意使用、拷贝和修改软件。
  • 可以免费分发软件或者出售软件,分发软件的方式不受限制。
  • 唯一的限制是软件必须包含该许可协议的声明。

         倘若与其他开源许可协议相比,MIT 许可协议是限制最少的,基本上只要附带 MIT 许可协议,任何人都可以利用该许可协议授权的软件做任何想做的事。

补:使用 MIT 许可协议的项目有 jQuery、Rails、Lua、PuTTY 与 Bitcoin 等等。

BSD

         BSD许可协议(Berkeley Software Distribution license)是被广泛使用的开源许可协议之一,其限制条款较为宽松。
         需要注意的是,如今 BSD 许可协议有两个版本是应用很广泛的,但它们之间是有区别的。它们分别是修订版 BSD 许可协议(The BSD 3-Clause License / New BSD License / Modified BSD License)和简版 BSD 许可协议(The BSD 2-Clause License / Simplified BSD License / FreeBSD License)。区别在于修订版 BSD 许可协议比简版 BSD 许可协议多了一则条款:「未获事前取得书面许可,不得使用本软件贡献者之名称,来为本软件之衍生物做任何表示支持、认可或推广、促销之行为。」

         修订版 BSD 许可协议的声明原文如下:

Copyright (c) [YEAR], [OWNER]
All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

         内容翻译过来便是(参考 Wiki):

Copyright (c) [时间] 著作权由[著作者]所有。著作权人保留一切权利。

这份授权条款,在使用者符合以下三条件的情形下,授予使用者使用及再散播本软件包装原始码及二进位可执行形式的权利,无论此包装是否经改作皆然:

  1. 对于本软件源代码的再散播,必须保留上述的版权宣告、此三条件表列,以及下述的免责声明。
  2. 对于本套件二进位可执行形式的再散播,必须连带以文件以及/或者其他附于散播包装中的媒介方式,重制上述之版权宣告、此三条件表列,以及下述的免责声明。
  3. 未获事前取得书面许可,不得使用本软件贡献者之名称,来为本软件之衍生物做任何表示支持、认可或推广、促销之行为。

免责声明:本软件是由本软件之贡献者以现状提供,本软件包装不负任何明示或默示之担保责任,包括但不限于就适售性以及特定目的的适用性为默示性担保。本软件之贡献者,无论任何条件、无论成因或任何责任主义、无论此责任为因合约关系、无过失责任主义或因非违约之侵权(包括过失或其他原因等)而起,对于任何因使用本软件包装所产生的任何直接性、间接性、偶发性、特殊性、惩罚性或任何结果的损害(包括但不限于替代商品或劳务之购用、使用损失、资料损失、利益损失、业务中断等等),不负任何责任,即在该种使用已获事前告知可能会造成此类损害的情形下亦然。

         对于使用者来说,这意味着:

  • 可以任意使用、拷贝和修改软件。
  • 可以免费分发软件或者出售软件,分发软件的方式不受限制。
  • 软件必须包含该许可协议的声明。
  • 未获书面许可,不能使用软件贡献者的名称来为软件的衍生产品做任何表示支持、认可或推广、促销之行为。

         从限制程度上来讲,修订版 BSD 许可协议与 MIT 许可协议相比,除了多了对于软件贡献者名称使用的限制以外,并无太大区别,都给予被许可者十分宽松的权利。事实上,简版 BSD 许可协议与 MIT 许可协议功能上是等价的…

补:使用 BSD 许可协议的项目有 Go、OpenSSH、V8(JavaScript引擎)与 Tengine 等等。

GPL

         GNU GPL,即 GNU 通用公共许可协议(GNU General Public License),是一个被广泛使用的自由软件许可协议条款,保证终端用户(End user)运行、学习、分享(拷贝)及修改软件的自由。
         GNU GPL 如今有两个版本比较流行,分别是 V2 版本V3 版本。无论哪一种版本,对于使用者来说,都意味着:

  • 可以任意使用、拷贝和修改软件。
  • 可以免费分发软件或者出售软件,分发软件的方式不受限制。
  • 不允许修改后和衍生的代码做为闭源的商业软件发布和销售。
  • 只要在一个软件中使用(「使用」指类库引用,修改后的代码或者衍生代码)GPL 协议的产品,则该软件产品必须也采用 GPL 协议,既必须也是开源和免费。这就是所谓的「传染性」。

         可以看得出,GPL 相比于 MIT 与 BSD 许可协议,限制条款苛刻不少。我觉得,MIT 与 BSD 许可协议重点在于鼓励代码重用,而 GPL 则侧重于代码及衍生代码的开源与免费使用,所以说,由于 GPL 严格要求使用了 GPL 类库的软件产品必须使用 GPL 协议,那么对于商业软件或者对代码有保密要求的人来说,就不适合使用 GPL 协议的开源代码。

         GPLv3 与 GPLv2 相比,条款限制更大,主要体现在软件专利、与其他许可协议的兼容性、源代码分区和组成的定义以及数位版权的管理(DRM)这四个方面,具体细节可查看 GNU 的一篇文章「Why Upgrade to GPLv3」。

补:使用 GPL 的项目有 Linux、Git 与 WordPress 等等。

LGPL

         LGPL,即 GNU 宽通用公共许可证(GNU Lesser General Public License),是由自由软件基金会公布的自由软件授权条款。它允许企业与软件开发者使用,或将 LGPL 授权的软件整合至他们自己的软件内(即使该软件是私有软件也被允许),同时不会受到 Copyleft 特性的许可证强制对软件开源的限制。
         LGPL 也有两个版本比较流行,分别是V2.1 版本V3 版本,它们之间的区别和 GPLv3 与 GPLv2 的区别是大同小异的。既然是 Lesser,就意味着其实 LGPL 只是比 GPL 更少限制而已,主要体现在:

  • 如果对遵循 LGPL 的软件进行任何改动和/或再次开发并予以发布,则产品必须继承 LGPL 协议,不允许封闭源代码。但是如果程序只是对遵循 LGPL 的软件进行任何连接、调用而不是包含,则允许封闭源代码。

         其实,LGPL 一开始是被称作 GNU Library General Public License,之所以改名的原因,是因为 Richard Stallman 觉得 Library 会带给开发者歧义,会让开发者觉得开发函数库就得用 LGPL,这和 GNU 的初衷并不吻合,特此,写了一篇文章「Why you shouldn’t use the Lesser GPL for your next library」,解释了改名的原因,挺有趣的,哈。

补:使用 LGPL 的项目有 Qt。

Apache

         Apache 许可协议(Apache License),是一个由 Apache 软件基金会发布的自由软件许可协议,它授予用户适用于版权和专利权的权利。由于有的许可证只适用于版权、不适用于专利权,Apache 许可协议的这一灵活性使其成为专利开发者的首选。(版权与专利权的区别可参考这篇文章「What are copyrights and patents?」)
         Apache 许可协议(2.0版本)保证了如下权利:

  • 权利的永久性:一旦许可证被授予,就可以无限期使用。
  • 权利的世界性:如果许可证在某一国授予,那么它同时也授予给其它所有国家。
  • 获取权利的免费性:不用预先支付任何使用费,也不用为每次使用或基于其它方式而付费。
  • 权利的非排他性:任何人都能使用经授权的软件。
  • 权利的不可撤回性:权利一旦授予,无人能撤回。

         需要遵守的规则有:

  • 如果修改了代码,需要在被修改的文件中说明。
  • 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
  • 如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。

         自我感觉,从限制层面上看,Apache 许可协议介于 BSD 许可协议与 GPL 之间,倘若对专利权比较看重,应当选择 Apache 许可协议。
         若对 Apache 许可协议(2.0版本)的授权条款有兴趣,可参考林懿萱发布在网上的一篇文章「化簡為繁的 Apache-2.0 授權條款」,该文章主要将 Apache 许可协议(2.0版本)与 BSD 许可协议进行对比,写得比较全面。

补:使用 Apache 许可协议的项目有 Apache、SVN 与 NuGet 等等。

如何选择和使用

兼容性

         在使用若干个开源代码的情况下,有可能会涉及到多于一种的开源许可协议,需要注意的是,并不是每种许可协议相互之间都是兼容的,那么该如何为合并后的软件选择合适的许可协议呢?为了更直观地解答这个问题,我引用了 dwheeler 写的一篇文章「The Free-Libre / Open Source Software (FLOSS) License Slide」里的一副插图:

(许可协议兼容性分析图,图片来自于 dwheeler

         在分析图中,每一个蓝色方块代表一种许可协议,一个箭头从协议 A 指向协议 B 代表的是可以在一个程序中合并含有这两份协议的开源代码,并可以使用协议 B 作为新的许可协议。倘若涉及的协议之间并没有直接的箭头关联,那么顺着它们各自的箭头往下寻找,找到相同的协议 C,就意味着它们可以合并,并使用 C 作为新的许可协议。譬如说,「Apache 2.0」与「GPLv2+」均可以到达「GPLv3 or GPLv3+」,就意味着可以使用「GPLv3 or GPLv3+」来合并它们。

选择

         主要介绍两种比较简便方法:

  1. 参考乌克兰程序员 Paul Miller 所制作的开源许可协议分析图

    (开源许可协议分析图,图片来自于 Paul Miller)


    (开源许可协议分析图中文解释版)

  2. 浏览 Github 旗下的 choosealicense.com 网站,该网站专门为开发者提供选择许可协议的指南,能比较直观地看出不同协议之间的差别,同时,交互体验也做得相当不错,十分推荐。

(在 choosealicense 下 GPLv3.0 的简介)

使用

         通常情况下,在源代码根目录下新建一个名为LICENSE的文件,该文件的内容为开源许可协议的声明内容,需要注意的是,需要在声明内容适当位置中填入著作者的信息。

  • 幸好,choosealicense.com 网站同时也提供协议的使用方法,可查阅参考。如下图红框所示,为 GPLv3.0 的使用方法:

(在 choosealicense 下 GPLv3.0 的详情页面)

END.

参考资料

授权声明