Hugo ʕ•ᴥ•ʔ Bear Blog

前言

💡 根据阮一峰老师的教程学习开源协议🌹

同时结合知乎专栏的文章进行一些补充;
文章标题:技术分享 | 如何为你的代码选择一个合适的开源协议?
作者:卢文双 资深数据库内核研发 🌹

如果你足够细心,很容易注意到即使是一小段代码,优秀的作者都在文件开头附上一段关于版权的声明,比如  Licensed under the MIT license。同时,一些博客也会标明”此文章采用  CC BY 4.0 CN  协议“。

如果我们拷贝了别人的代码或文章却没注意版权问题,在国外法律意识特别强的环境下(国内版权意识也在逐步加强),那么我们的作品会因触犯别人的权益而违法。即使是最开放的开源协议,最低要求也是保留原作者对代码的声明,所以开源不等于免费,也不等于没有约束

何为 LICENCE?

LICENCE 是软件的授权许可,详细说明了获得代码后拥有的权利,哪些操作是允许的,哪些操作是禁止的。软件的版权许可证可有很多方式,本文仅限于讨论开源软件协议 Open Source License。

对于大多数人来说,没必要花大把时间去写许可协议,选择一种比较流行的开源协议就足够了,省时省力,更便于自己作品的传播,于人于己都有利。

说句题外话,很多国外开发者在尊重他人劳动成果方面做得很好,如果 A 的作品是因为 B 的作品的启发而来,A 甚至都没有使用 B 任何一句代码,但 A 会在他的作品里面指明是受到了 B 的启发:

```text
Inspired by XXX link: http://www.xxxx.com
```

正文

作为一个开发者,如果你打算开源自己的代码,千万不要忘记,选择一种开源许可证(license)。 许多开发者对开源许可证了解很少,不清楚有哪些许可证,应该怎么选择。本文介绍开源许可证的基本知识,主要参考了 OpenSource.com


一、什么是开源许可证

开源许可证是一种法律许可。通过它,版权拥有人明确允许,用户可以免费地使用、修改、共享版权软件。

版权法默认禁止共享,也就是说,没有许可证的软件,就等同于保留版权,虽然开源了,用户只能看看源码,不能用,一用就会侵犯版权。所以软件开源的话,必须明确地授予用户开源许可证。


二、开源许可证的种类

目前,国际公认的开源许可证共有80 多种。它们的共同特征是,都允许用户免费地使用、修改、共享源码,但是都有各自的使用条件。

如果一种开源许可证没有任何使用条件,连保留作者信息都不需要,那么就等同于放弃版权了。这时,软件可以直接声明进入"公共领域"(public domain)。

根据使用条件的不同,开源许可证分成两大类。

宽松式(permissive)许可证 Copyleft 许可证


三、宽松式许可证

3.1 特点

宽松式许可证(permissive license)是最基本的类型,对用户几乎没有限制。用户可以修改代码后闭源。

它有三个基本特点。

(1)没有使用限制

用户可以使用代码,做任何想做的事情。

(2)没有担保

不保证代码质量,用户自担风险。

(3)披露要求(notice requirement)

用户必须披露原始作者。


3.2 常见许可证

常见的宽松式许可证有四种。它们都允许用户任意使用代码,区别在于要求用户遵守的条件不同。

(1)BSD(二条款版)

分发软件时,必须保留原始的许可证声明。

(2) BSD(三条款版)

分发软件时,必须保留原始的许可证声明。不得使用原始作者的名字为软件促销。

BSD 可证

BSD可证也来源于大学,与MIT差不多,也非常简单、慷慨。


BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用、修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。前提是当你发布使用了BSD协议的代码,或者以BSD协议代码为基础开发自己的产品时,需要满足三个条件:

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

BSD 开源协议鼓励代码共享,但需要尊重代码作者的著作权。BSD 开源协议允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布、销售,是对商业集成很友好的协议。因此,很多公司在选用开源产品的时候都首选BSD协议。

(3)MIT

分发软件时,必须保留原始的许可证声明,与 BSD(二条款版)基本一致。

MIT 开源协议是史上最为简洁、慷慨的开源协议之一。作者只想保留版权,而无任何其他了限制。也就是说,你必须在你的发行版里包含原许可协议的声明,无论你是以二进制发布的还是以源代码发布的。

特点:


(4)Apache 2

分发软件时,必须保留原始的许可证声明。凡是修改过的文件,必须向用户说明该文件修改过;没有修改过的文件,必须保持许可证不变。

Apache Licence 是著名的非盈利开源组织 Apache 采用的协议。该协议和 BSD 类似,同样鼓励代码共享和尊重原作者的著作权,同样允许修改代码、再发布(作为开源或商业软件)。需要满足的条件也和 BSD 类似:

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

Apache Licence 也是对商业应用友好的许可,使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。


四、Copyleft 许可证

4.1 Copyleft 的含义

Copyleft 是理查德·斯托曼发明的一个词,作为 Copyright (版权)的反义词。

Copyright 直译是"复制权",这是版权制度的核心,意为不经许可,用户无权复制。作为反义词,Copyleft 的含义是不经许可,用户可以随意复制。

但是,它带有前提条件,比宽松式许可证的限制要多。

如果分发二进制格式,必须提供源码修改后的源码,必须与修改前保持许可证一致不得在原始许可证以外,附加其他限制

上面三个条件的核心就是:修改后的 Copyleft 代码不得闭源。

4.2 常见许可证

常见的 Copyleft 许可证也有四种(对用户的限制从最强到最弱排序)。

(1)Affero GPL (AGPL)

如果云服务(即 SAAS)用到的代码是该许可证,那么云服务的代码也必须开源。

(2)GPL

如果项目包含了 GPL 许可证的代码,那么整个项目都必须使用 GPL 许可证。

GPL(GNU GENERAL PUBLIC LICENSE)来源于自由软件联盟 GNU,GPL/LGPL 侧重于代码及衍生代码的开源与免费使用。

GPL 协议的主要内容是只要在一个软件中使用(”使用”指类库引用,修改后的代码或者衍生代码)GPL 协议的产品,则该软件产品必须也采用 GPL 协议,既必须也是开源和免费。这就是所谓的”传染性”

由于 GPL 严格要求使用了 GPL 类库的软件产品必须使用 GPL 协议,对于使用 GPL 协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础。

我们很熟悉的 Linux 就是采用了 GPL。GPL 协议和 BSD, Apache Licence 等鼓励代码重用的许可很不一样。GPL 的出发点是代码的开源/免费使用/引用/修改衍生代码的开源/免费使用,但不允许修改后和衍生的代码做为闭源的商业软件发布和销售。

其它细节和 BSD/Apache 等协议类似。

(3)LGPL

如果项目采用动态链接调用该许可证的库,项目可以不用开源。

LGPL(GNU LESSER GENERAL PUBLIC LICENSE)来自于自由软件联盟 GNU,可以翻译为更宽松的 GPL 协议,也属于传染性开源协议。

LGPL 是 GPL 的一个主要为类库使用设计的开源协议。和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议不同,LGPL 允许商业软件通过类库引用(link)方式使用 LGPL 类库而不需要开源商业软件的代码。这使得采用 LGPL 协议的开源代码可以被商业软件作为类库引用并发布和销售。

但是如果修改 LGPL 协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用 LGPL 协议,因此,LGPL 协议的开源代码很适合作为第三方类库被商业软件引用,但不适合希望以 LGPL 协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。

GPL/LGPL 都保障原作者的知识产权,避免有人利用开源代码复制并开发类似的产品。

(4)Mozilla(MPL)

只要该许可证的代码在单独的文件中,新增的其他文件可以不用开源。


五、常见问题

本节回答一些开源许可证的常见问题。

5.1 什么叫分发(distribution)?

除了 Affero GPL (AGPL) ,其他许可证都规定只有在"分发"时,才需要遵守许可证。换言之,如果不"分发",就不需要遵守。

简单说,分发就是指将版权作品从一个人转移到另一个人。这意味着,如果你是自己使用,不提供给他人,就没有分发。另外,这里的"人"也指"法人",因此如果使用方是公司,且只在公司内部使用,也不需要遵守许可证。

云服务(SaaS)是否构成"分发"呢?答案是不构成。所以你使用开源软件提供云服务,不必提供源码。但是,Affero GPL (AGPL) 许可证除外,它规定云服务也必须提供源码。

5.2 开源软件的专利如何处理?

某些许可证(Apache 2 和 GPL v3)包含明确的条款,授予用户许可,使用软件所包含的所有专利。

另一些许可证(BSD、MIT 和 GPL v2)根本没提到专利。但是一般认为,它们默认给予用户专利许可,不构成侵犯专利。

总得来说,除非有明确的"保留专利"的条款,使用开源软件都不会构成侵犯专利。

5.3 什么是披露要求?

所有的开源许可证都带有"披露要求"(notice requirement),即要求软件的分发者必须向用户披露,软件里面有开源代码。

一般来说,你只要在软件里面提供完整的原始许可证文本,并且披露原始作者,就满足了"披露要求"。

5.4 GPL 病毒是真的吗?

GPL 许可证规定,只要你的项目包含了 GPL 代码,整个项目就都变成了 GPL。有人把这种传染性比喻成"GPL 病毒"。

很多公司希望避开这个条款,既使用 GPL 软件,又不把自己的专有代码开源。理论上,这是做不到的。因为 GPL 的设计目的,就是为了防止出现这种情况。

但是实际上,不遵守 GPL,最坏情况就是被起诉。如果你向法院表示无法履行 GPL 的条件,法官只会判决你停止使用 GPL 代码(法律上叫做"停止侵害"),而不会强制要求你将源码开源,因为《版权法》里面的"违约救济"没有提到违约者必须开源,只提到可以停止侵害和赔偿损失。


总结和致谢

下方表格中出现的用词的解释:

#实用教程