开源 License

作为一个开源爱好者,我们经常会写一些开源的软件或者工具在网上分享,或者为一些其他的开源软件贡献一些自己的力量,但是对于开源许可(License)是有很多种的,每一种有不同的约束,在法治国家是具有法律约束力的。

概念

贡献者(Contributors)& 受益者(Recipients)

贡献者(Contributors) 指的是对某个开源软件或项目提供了代码(包括最初的或者修改过的)并发布的人或实体(团队、公司、组织等),按照参与时间先后,可以分为初始贡献者(Initial Contributor)和后续贡献者(Subsequent Contributors)。

受益者(Recipients) 指的是开源软件或项目的获取者,也就是那些用了这个开源软件的人,后续贡献者也属于受益者之列。

源码(Source Code)& 类库(Object Code)

源码(Source Code) 就是指各种语言写成的源代码,通过源码结合文档,我们可以了解各个开源软件的具体细节,也可以做很多的修改。

类库(Object Code) 就是指由源码编译后生成的”类库”,当然很多语言不需要编译,那源码本身就是类库。

分清楚这两个概念很重要,有些开源协议对”你发布的是哪种 Code 时应该怎样”有着明确的约束。

衍生模块(Derivative Module)& 独立模块(Separate Module)

衍生模块(Derivative Module) 指的是依托或包含”最初的”或者”从别人处获取的”开源代码而产生的代码,是原源代码的增强、改善和延续的模块。

独立模块(Separate Module) 指的是参考或借助原源代码开发出的独立的、不包含也不依赖于原源代码的模块。

理解这两个概念的目的在于,很多开源许可对涉及商业发布时,哪些是衍生的、哪些是独立的,有着明确的规定。

开放源码促进会(Open Source Initiative

简称 OSI,1998 年 2 月由 Bruce PerensEric S. Raymond 创立,旨在推动和促进开源软件的发展。官网是 opensource.org

目前经过 OSI 批准的开源协议有 76 种,列表在官网上有,另有一份介绍比较全面的列表

常见协议

我们常见的开源 License:BSD、Apache、GPL、LGPL、MIT、MPL 都是 OSI 批准的,它们对受益者有着不同的约束。

BSD License

BSD 是 Berkeley Software Distribution 的缩写,出现于上世纪 70 年代,最初是为了发行 UNIX 衍生版操作系统而起草的。

这个 License 给了使用者很大的自由,基本上可以自由使用、修改源代码,也可以将修改后的代码作为开源或专有软件再发布。

对使用者的约束:

  1. 如果再发布的产品中包含源代码,则源代码中必须带有原来的 BSD License。
  2. 如果再发布的只是二进制类库/软件,则需要在文档和版权声明中包含原来的 BSD License。
  3. 不可以用开源代码的作者/机构名字和原产品名字做市场推广。

举个例子:你用开源代码 A 修改后产生了产品 B,你对 B 的控制由你自己决定,可以用任何协议再开源,也可以闭源商业发布。但因为 B 中包含了 A,你需要在 B 的版权声明中注明有使用到 A,并附带上 A 的开源协议,且不能以原作者名义做商业推广。

目前常见的版本有:BSD 3-Clause LicenseBSD 2-Clause License

Apache License

Apache Software Foundation(ASF) 起草,现在流行的是 Apache License 2.0

该 License 和 BSD License 类似,鼓励代码共享和尊重原作者的著作权,允许代码修改和再发布(开源或商业)。

需要满足的条件:

  1. 需要给代码提供一份 Apache License。
  2. 如果修改了代码,需要在被修改的文件中说明。
  3. 衍生代码中需要带有原代码中的 License、商标、专利声明和其他原作者规定需要包含的说明。
  4. 如果再发布的产品包含 Notice 文件,则 Notice 文件中需要带有 Apache License。

MIT License

最早于 1988 年由麻省理工学院(MIT)起草,作者只想保留版权,而无任何其他限制。

你必须在发行版里包含原许可协议的声明,无论是以二进制还是源代码形式发布。商业软件可以使用,也可以修改 MIT License 的代码,甚至可以出售。

GPL

GNU General Public License,简称 GPL,第一个版本起草于 1989 年 2 月。旨在保证代码的开源/免费使用,以及引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代码以闭源商业软件形式发布和销售。目前使用该 License 最为我们熟悉的就是 Linux。

GPL 的”传染性”:只要在软件中使用了 GPL 许可的产品(类库引用、修改后的代码或衍生代码),该软件产品也必须采用 GPL 许可,即必须开源和免费。

因此,对于代码有保密要求的商业软件,GPL 许可的开源代码不适合作为类库或二次开发的基础。

常见版本:GPL-2.0GPL-3.0

LGPL

GNU Lesser General Public License,简称 LGPL。因为 GPL 太严苛,为了让商业公司也能使用,设计了 LGPL。

LGPL 允许商业软件通过类库引用(link)方式使用 LGPL 类库而不需要开源商业软件的代码。但如果修改了 LGPL 许可的代码或做了衍生,则所有修改的代码和衍生代码都必须采用 LGPL 许可。

简单说:商业软件可以使用,但不能修改 LGPL 许可的代码——改了人家的代码你也要开源。

常见版本:LGPL-2.1LGPL-3.0

MPL

The Mozilla Public License,简称 MPL,1998 年初由 Netscape 公司的 Mozilla 小组为其开源软件项目设计。

MPL 允许免费重发布、免费修改,但要求修改后的代码版权归软件的发起者。这种授权维护了商业软件的利益,要求基于这种软件的修改无偿贡献版权给该软件,围绕该软件的所有代码版权都集中在发起开发人手中。商业软件可以使用,也可以修改 MPL-2.0 协议的代码,但修改后的代码版权归软件的发起者。

各种 License 对比

几个关键维度的说明:

项目描述
License and copyright notice在代码中保留作者提供的许可和版权信息
State Changes在代码中声明对原来代码的重大修改及变更
Disclose Source代码必须公开。基于 LGPL 协议则只需公开使用的开源代码部分
Library usage该库可以用于商业软件中
Hold Liable代码的作者承担代码使用后的风险及后果
Use Trademark可以使用作者的姓名、Logo 或商标
Sublicensing允许在软件分发传播过程中附加原来没有的许可条款

各 License 的要求、允许与禁止对比:

License要求允许禁止
BSD许可和版权信息商用、分发、修改、私用、附加许可责任承担
Apache协议和版权信息、声明变更商用、分发、修改、私用、专利授权、附加许可责任承担、商标使用
MIT许可和版权信息商用、分发、修改、私用、附加许可责任承担
MPL公开源码(全部)、协议和版权信息商用、分发、修改、私用、专利授权、附加许可责任承担、商标使用
GPL公开源码(全部)、协议和版权信息、声明变更商用、分发、修改、私用、专利授权责任承担、附加许可
LGPL公开源码(修改部分)、协议和版权信息、库引用商用、分发、修改、私用、专利授权、附加许可责任承担
No license协议和版权信息商用、私用分发、修改、附加许可
UnlicenseN/A商用、私用、分发、修改责任承担

No license:你保留所有权利,不允许他人分发、复制或创造衍生物。将代码发布到 GitHub 时需遵守 GitHub 协议,别人可以查看和 Fork 你的代码。

Unlicense:你放弃版权,将劳动成果无私贡献出来,丧失对作品的全部权利。

开源授权许可的区别图:

开源授权许可的区别
开源授权许可的区别

另外值得注意的是专利授权问题。BSD、MIT 在 License 里没有明确专利授权的声明,可能存在专利授权争议。GPL-2.0、LGPL-2.1 虽有专利相关规定但不够明确,GPL-3.0 则明确了专利授权,不会存在这个问题。公司商业软件使用开源软件时需注意 License 的版本和具体描述。

你会选择哪种开源授权许可?

参考: