如何选择开源许可证
2011-05-04 09:43:22 阿炯

如何为代码选择开源许可证,这是一个问题。

世界上的开源许可证,大概有上百种。很少有人搞得清楚它们的区别。即使在最流行的六种----GPL、BSD、MIT、Mozilla、Apache和LGPL----之中做选择,也很复杂。乌克兰程序员Paul Bagwell,画了一张分析图,说明应该怎么选择。这是我见过的最简单的讲解,只用两分钟,你就能搞清楚这六种许可证之间的最大区别。


选择开源项目什么因素最重要-许可证排第一

开发人员在决定是否使用某个开源项目时考虑到的最重要事项是什么,代码质量?安全性?好的文档?

上述因素都很重要,但根据 Tidelift 和 The New Stack 的联合调查,控制着开源项目的开源许可证才是最需要考量的因素。86% 的受访者认为“可接受的开源许可证”对于决定使用开源软件包来讲非常重要,其中 61% 的人将其描述为“非常重要”。在超过千名员工的大公司中,认为开源许可证极其重要的开发人员占比高达 78%。当然许可证不是被考虑的唯一因素。调查显示,开源项目的活跃程度和维护状况的重要性也不相上下。


不过,开源许可证排在第一位还是有着充分的理由:没有开发人员愿意在不知道接下来将如何发展的情况下,开始使用新的软件包。这些年来,高度宽松的许可证(Apache,BSD,MIT)采用率一直在急剧攀升,而限制性更强的许可证(GPL)却呈下降趋势。

2000 年代初期,自由软件的倡导者开始反对开源许可证的激增,随着 OSI 发起了一个旨在遏制许可证扩散的项目,这一争论在 2014 年到达顶峰。当时,许多公司或开发人员各自发布了虚有其名的许可证,但内容和本质与现有许可证几乎没什么不同,这只会导致开源的合规性变得更为复杂。

此后的十多年来,开源许可证的格局基本上保持不变。近两年,出现了一些由新一代开发者制定的许可证,例如用于争取改善工作条件的 anti-996 license,加入了道德条款的 Hippocratic license 等等。对于这些许可证背后的意图,人们可以同意或是不同意。更重要也更难争辩的,是它们的实用性。

简而言之,开源许可证是一个非常实际的问题。开发人员希望寻找有效的软件,并能够长久维持。调查还显示,他们对解锁新的开源许可证并不感兴趣。

OSI 认证的开源 License 有哪些呢,这里根据 OSI 官方分类,简单介绍一下。

什么是软件许可协议?

关于究竟什么是许可协议的问题上有很多事实而非的说法。当你给软件附上许可证时,意味着你将保留对软件的所有权利。你将对你的作品拥有原创版权(或者是专利权,如果你申请到了)。许可协议用来授权其他人具有某种使用你的作品的权利。

依靠许可协议将你的作品对外开源或者对你的作品的各个方面逐一进行授权,是一个不错的方法。一旦对外开源,你将失去所有对你的作品的版权,别人也没有义务将你标注为作品的原创者或捐献者。而我说的后一种情况里,估计你需要从设计和开发的工作中抽出更多的时间来处理遇到的各种侵权问题。

开源许可协议使人们免去了研究那些专业的许可条款的麻烦,使人们更方便的对开源项目贡献出自己的代码。而且它还能保护你作为作品的原创作者,确保你至少拥有由于贡献参与而带来的署名荣誉。它还能用来阻止其他人企图声明对你的作品拥有所有权的行为。

GNU General Public License 通用公共许可协议

(GPL) 可以说是在开源项目中使用最广泛的一种协议来。 GPL 对开发开源软件的开发者们在权利上进行了周详的认可和保障。本质上讲,它允许用户对软件进行合法的拷贝,传播和修改。这意味着你可以:

随意复制
把它拷贝到你自己的服务器上、你的客户的服务器上、你自己的电脑上,基本上任何你能想到的地方。对你拷贝的数量也没有任何限制。(译者按:中国人用盗版用惯了,估计对这点会很不以为然。)

随意传播
在你的网站上做一个下载链接进行下载。拷贝到你的移动硬盘里送人。把原代码打印出来,站在屋顶散发(最好别这样做,会浪费纸,而且影响环境清洁)。

收费传播
如果你想通过发放这种软件来收取费用,你可以把它放到你的网站上出售,或者通过其它你可以做到的方式达到你的目的。 但是, 你必须将一份GNU GPL 协议和你卖出的软件一起给买主,以让买主知道这种软件是可以通过其它途径免费获得的。最好是事先人知道这些,以及你为什么要出售它们。

随意修改
如果你想增加或删减一些功能,那就干吧。如果你想在其它项目里使用它里的一部分代码,也是允许的。只是有一点,这个其它项目也必须是使用 GPL 授权的。

请注意一个非常重要的概念:对源代码的传播和对已编译代码的传播是两个完全不同的事情。因此,有些应用程序的许可协议对着两种形式的代码分别进行了不同的使用授权。 更多的信息可以参考文章 GPL 协议实用手册 (作者 @PierreJoye)。要想使用GPL, 你还必须在代码里添加一些协议相关信息,还要有一份许可协议的副本拷贝。

GNU Lesser General Public License 次通用公共许可协议

还需要了解另外一种 GNU 许可协议:(LGPL),它对作品的使用保留了更少的权利。通常,LGPL 适用于一些类库,它允许这些类库能够被非GPL或非开源软件引用。因为 GPL 要求,要想使用 GPL 保护下的代码,你必须把你的软件也置于 GPL 协议之下。开发者不能够在商业的和具有私有权的软件里使用GPL协议下的程序。而 LGPL 放弃了这些限制,它不要求其它程序也必须使用相同的协议才能使用这些代码程序。

BSD 许可协议

BSD 协议有很多分支,它们都代表了一种宽松的自由软件协议,相对其它协议,例如GPL,来说,它们对软件的传播给予了更少的限制。

在这种协议的各种版本中,有两个版本格外的重要: 新 BSD 协议/修订版 BSD 协议和简化 BSD 协议/FreeBSD 协议。这两类协议都实现的对 GPL 兼容的自由软件协议,而且被 Open Source Initiative 认可为开源软件协议。

新 BSD 协议(3-clause license)无任何限制的允许你以任何目的二次分发这种软件,唯一的要求是必须保留拷贝权的声明和协议里的软件权利放弃条款。这种协议还有一个限制,未经许可不得使用这个作品的所有曾经捐助者的署名。新 BSD 协议和简化 BSD 协议的最主要的区别是后者删除了署名条款。

MIT 许可协议

MIT 协议应该是在流行的开源协议中最简短的、使用最广泛的一种协议。它的条款非常的宽松,而且跟其它协议相比更自由。这种协议最基本的条款(the information that it is provided without warranty, which comprises the final paragraph)如下:

特此授权,任何人都可免费获得这个软件以及相关文档(the Software)的拷贝,可以无限制的使用这个软件,包括无限制的权利去使用、复制、修改、合并、发布、附加从属协议,以及/或者出售软件的拷贝,同时,为了让软件的提供者有权利做到这些,下面的条件必须遵守:

上面的拷贝权声明和许可声明必须包含在所有的这个软件拷贝里和实际分署部分里。

这也就是说:
可以随意使用,复制,修改这个软件。没有人能够阻止你在任何工程里使用它,你可以复制任意次数、以任何形式,或按你的愿望修改它。
可以向外免费发放,或出售。你可以随意的分发它,没有任何限制。
唯一的限制是你必须接受协议条款。

MIT 协议是目前最少限制的协议。它基本上就是任何人可以对这个协议下的软件的做任何的事情,只要你能认可这个协议。

Apache 许可协议

Apache 许可协议,2.0版本授予了用户大量的权利。这些权利可以应用于拷贝权,也可以用于专利权。因为很多许可协议只能适用于拷贝权,不适用于专利权,所以这个灵活性就成了让有专利的开发者们选择许可协议时的一个显著参考因素。

下面是关于 Apache 许可协议所允许的事项的详细说明:

权利永恒
一旦被授权,权利永久不失。

权利无疆界
在一个国家里被授权,形同于在所有国家被授权。例如,你在美国,但许可权最初在印度被授予,你同样可以使用这个被授权的程序。

授权无需付费和支付酬劳
你既不需要在使用之前支付任何的费用,也无需在每次使用时支付任何的费用,或者其它类似情况。

权利不排他
使用这种许可协议下的软件时,不妨碍你使用其它软件。

权利不可变更
权利一旦授予,不可剥夺。也就是说,你在使用这个软件的过程中,你无需担心这种情况:当你开发出了令人羡慕的基于这种授权软件的衍生产品时,有人突然跳出来对你说,抱歉,你将不再被允许使用这个程序。(在这个协议里有个条款声明:如果你控告别人在这个许可协议下的产品有侵犯专利的行为,那你的授权将会自动终止,但这只是适用于有专利权的作品。只要你不搞有专利作品的诉讼,你永远无需担心这种问题。)

对再分发的作品还有个特殊要求,总的就是说要给予这些程序的作者和许可协议的维护者适当的名誉。

Creative Commons 知识共享协议

(CC) 许可协议并不能说是真正的开源协议,它们大多是被使用于设计类的工程上。CC 协议种类繁多,每一种都授权特定的权利。一个 CC 许可协议具有四个基本部分,这几个部分可以单独起作用,也可以组合起来。下面是这几部分的简介:

署名
作品上必须附有作品的归属。如此之后,作品可以被修改,分发,复制和其它用途。

相同方式共享
作品可以被修改、分发或其它操作,但所有的衍生品都要置于CC许可协议下。

非商业用途
作品可以被修改、分发等等,但不能用于商业目的。但语言上对什么是商业的说明十分含糊不清(没有提供精确的定义),所以你可以在你的工程里对其进行说明。例如,有些人简单的解释非商业为不能出售这个作品。而另外一些人认为你甚至不能在有广告的网站上使用它们。 还有些人认为商业仅仅指你用它获取利益。

禁止衍生作品
这意味着你可以复制和分发它们,但你不能以任何方式修改它们,或基于它们进行二次创作。

上面提到过CC许可协议的这些条款可以自由组合使用。大多数的比较严格的CC协议会声明署名权,非商业用途,禁止衍生条款,这意味着你可以自由的分享这个作品,但你不能改变它和对其收费,而且必须声明作品的归属。这个许可协议非常的有用,它可以让你的作品传播出去,但又可以对作品的使用保留部分或完全的控制。最少限制的CC协议类型当属署名协议,这意味着只要人们能维护你的名誉,他们对你的作品怎么使用都行。

CC许可协议更多的是在设计类工程中使用,而不是开发类,但没有人或妨碍你将之使用与后者。只是你必须要清楚各部分条款能覆盖到的和不能覆盖到的权利。

受欢迎且被广泛使用或具有强大社区的许可证

国际许可证

特殊用途许可证

主要应用场景:学校和政府等提供许可方可能会有一些特殊的问题,例如政府版权的特殊规则。

其它许可证

此类许可证不属于任何类别。

与更流行的许可证重复的许可证

该组中的许可证是优秀的,并且具有自己的追随者,但是它们被认为与现有流行的许可证完全或部分重复了。

不可重复使用的许可证

该组中的许可特定于其作者,不能被其他人重复使用。

被取代的许可证

此类别中的许可证已被较新的版本取代。

自愿退休的许可证

此类中的许可证已不可用。

未分类的许可证

详情查看:

https://opensource.org/licenses/category

https://opensource.org/licenses/alphabetical


中国信通院在 2018 年 3 月发表的《开源治理白皮书》中有相当程度的普及,非常值得一看。


开源项目应如何处理版权声明

源代码中的版权声明前后不一致且维护不善,其结果将导致使用者难以理解。那么是否应将更多资源用于维护版权声明?并非如此。版权声明是单行字符串,通常包括单词 “Copyright”(或某些替代词,如©)、名称(通常是个人或公司)和年份。

在本文中,我不关注许可证或许可证声明(有时可能包括版权声明)。我关于版权声明维护投资处于低优先级的建议不适用于许可证信息。许可证信息应清晰呈现并保持准确。如果您邀请他人使用您的软件并对其进行操作,请通过提供并维护清晰的许可证信息来明确授予的权限。

回到版权声明:它们的法律意义是什么?如果您认为版权声明符合法律要求或至少提供了重要的法律优势,请三思。此类声明在开源软件中的法律意义是如此之小,以至于人们可以轻易地找到超过法律意义的实际考虑。

尽管这些声明可能看起来很重要,但它们在当今的源代码中的存在很大程度上是过去版权法的​​残余。有一段时间,如果未在已出版的材料中包含版权声明,可能会导致完全丧失美国版权法提供的权利;当美国最终加入许多其他国家已经加入的"伯尔尼公约"时,情况发生了变化(美国于1988年11月16日加入该条约,并于 1989 年 3 月 1 日在美国生效)。

如果开源软件中的这些声明有实际作用,则一个项目可以采用公约而不是由于美国对“版权声明”的法定要求去维护版权声明,从而以更少的成本去维护,并且仍然获得一些实用价值。由于美国版权法一直是推动版权声明使用的重要因素,因此我将在此进行更深入的探讨。美国版权局发布了称为通函的指导文件,3 号通函中有关版权声明的内容包括:

“在 1989 年 3 月 1 日之前首次出版的所有作品都必须进行版权声明,但下面讨论的某些例外情况。如果省略了该声明或在使用版权声明时出现了错误,则该作品在美国通常失去版权保护。 对于 1989 年 3 月 1 日或之后出版的作品,未出版的作品以及外国作品,版权声明是可选的;但是,将声明包含在您的作品中在法律上有利。”

总而言之,在美国,版权声明在1988 年就非常重要。但是,当美国加入许多其他国家存在的《伯尔尼公约》时,美国法律对版权声明的关键作用被消除了。公约规定:“享有和行使这些权利不需任何手续……”

麻省理工学院(The X Window System)和加州大学伯克利分校(Berkeley Software Distribution)的软件项目促进形成了早期的许可证文本,每个许可证文本都起源于严格的 “notice-or-lose-it” 要求仍然有效的时期( 或至少对那些为这些许可证文本做出贡献的人来说,“notice-or-lose-it” 仍记忆犹新 )。其结果是这些许可证文本都具有关于复制版权声明的明确内容。

随着基于这些文本的许可证的广泛使用,大多数开源软件开发人员已经看到版权声明似乎在许可证中显得很重要。但是这些文本是在考虑较早的法律制度的情况下创建的。现在,距《伯尔尼公约》(大多数其他国家已经接受)的无手续规定首次适用于美国的时间已经过去30年了。要了解《伯尔尼公约》的采纳程度,请参阅管理《伯尔尼公约》的世界知识产权组织维护的缔约方清单。您可能想知道上面引用中提到的那些“法律优势”,答案在 3 号通函的末尾。

尽管对于未出版的作品、外国作品以及于 1989 年 3 月 1 日或之后出版的作品,声明是可选的,但使用版权声明具有以下优势:
    声明使潜在用户意识到作品拥有版权。
    对于已发表的作品,声明可能会阻止版权侵权诉讼中的被告试图限制其基于无辜侵权抗辩的损害赔偿或禁令救济的责任。
    声明标识了在首次发布作品时版权所有者的权利,供寻求使用该作品许可的各方使用。
    声明标识首次出版的年份,对于匿名作品、假名作品或出租作品而言,可用于确定版权保护期限。
    声明可能会通过标识版权所有者并指定版权期限来防止其成为孤立作品。


以上就是版权声明的优势。

我引用了美国版权局第 3 号通函,因为与基本法规相比,它对要求的措辞更具可读性。美国联邦一级的成文法已被编入所谓的《美国法典》,该法典由一系列“标题”组成。标题 17 是版权。版权声明的详细信息位于该标题的第 401-406 部分。一个可以从 17 USC 401 开始。有关法规要求在版权声明中包含的三个要素的说明,请参见 17 USC 401(b)。如果要查看“遗漏对无辜侵权者的影响”的详细信息,请参见 17 USC 405(b)。

为了提供更准确的信息,为什么不清理代码库中的版权声明?令人尴尬的是,17 USC 506(c)(欺诈性版权声明)、17 USC 506(d)(欺诈性删除版权声明)和 17 USC 1202(a)(虚假版权管理信息)提供了一些不利因素(即使仅限于不良意图)。由于价值较低且存在一定风险(如果在进行更改时出错),因此无怪乎没有将更多资源用于维护版权声明。

有些人和公司强调将详细的声明放入根据开源许可证提供的代码中,有些没有。随着开源项目的发展,某些贡献可能包含声明,而其他贡献则没有。即使文件的内容与原始版本相比发生了很大的变化,文件也可以包含原始声明,而不包含其他声明。或者以后的贡献者可以向以前没有声明的文件中添加一个声明。那么,版权声明的要素是“该作品的首次出版年份”吗?这又意味着什么?见仁见智。那么更新呢?比如当其他贡献产生的时候呢?

至于通过挖掘版权声明数据得出结论,要谨慎,并且不要有过高期望。

开源项目应该做什么?

请提供并维护清晰,准确的许可证信息。

对于版权声明,很难证明为维护版权声明详细信息而进行的投资是合理的。但是有些人可能希望有声明。至于“软件的起源”,也许仅仅用于项目而不是尝试捕获更细粒度的内容会更有用和更准确。至于出版年份?手动维护源文件太麻烦所以不大值得,源管理工具以更低的资源成本提供了更准确的信息。有关版权声明的更多详细信息,推荐阅读:开源软件项目中的版权声明,作者:史蒂夫·温斯洛(Steve Winslow),写于 2020年 1 月 10 日。

信通院可信开源发布的《开源许可证兼容性指南》中列举出了许可证的兼容性列表的两种情况,给出了兼容性指示:
1).合并/修改代码:从要组合的代码中取出整体/部分代码,修改或不修改都可以,然后把它添加到你的代码中构成一个作品。
2).使用库:没有直接复制代码,在编译或运行时通过链接、导入或其他典型的机制(例如静态与动态链接)把要组合的开源代码绑定在一起。



该文章最后由 阿炯 于 2024-02-05 10:13:09 更新,目前是第 2 版。