本文目录导读:

- 核心原则:你的核心诉求是什么?
- 第一类:严格“传染性”许可证(Copyleft 强)
- 第二类:温和“传染性”许可证(弱 Copyleft)
- 第三类:宽松“允许性”许可证(Permissive)
- 快速决策流程图
- 特别说明:CC 协议(Creative Commons)
- 最后,一个简单的建议
选择开源许可证,本质上是在保护代码作者的权利与促进代码被广泛使用之间做权衡。
不需要把每种许可证都背下来,下面是一份从实际应用场景出发的选择指南,供你参考。
核心原则:你的核心诉求是什么?
请先问自己三个问题:
- 你介不介意别人用你的代码做闭源的商业产品?(别人基于你的代码,修改后不公开源码就卖钱)
- 你担不担心大公司用了你的代码后,不把他们的改进反哺回社区?
- 你希望你的代码被尽可能多的人使用和传播吗?
根据这三个问题的答案,可以把主流许可证分为三大类。
第一类:严格“传染性”许可证(Copyleft 强)
代表:GPL 3.0
- 核心特征:“你用它,你的代码也得用同样许可证公开”,这是“病毒式”传染条款。
- 适合场景:你希望自己的代码永远保持开源,任何基于它的衍生作品也必须开源。
- 主要缺点:商业公司通常非常排斥GPL,如果你的代码被一个商业软件以GPL方式“污染”了,他们要么不碰,要么宁愿重写。
- 特别注意:GPL有版本2和3,3.0增加了反TiVo化等条款,更为严格。Linux内核用的是GPL 2.0。
如果你是坚定的开源理想主义者,或者在做的是操作系统、底层工具类项目,希望杜绝闭源商业分支,选GPL。
第二类:温和“传染性”许可证(弱 Copyleft)
代表:MPL 2.0, LGPL
- 核心特征:传染性是有边界的,修改后的代码文件需要开源,但以库的形式被其他程序调用时,调用方的代码可以不继承开源。
- 适合场景:
- LGPL:主要用于代码库(Library),你用了一个LGPL的图形库,开发了一个商业游戏。你不需要公开游戏源码,但如果你修改了那个图形库,修改部分必须开源。
- MPL 2.0:比LGPL更友好一些,修改了某个文件,仅该文件需保持MPL;新增文件可以使用其他许可证。
- 代表项目:Mozilla Firefox(MPL 2.0)、LibreOffice(MPL 2.0)、一些知名的C/C++库(LGPL)。
你希望别人可以把你的代码用在闭源项目中(比如一个库或组件),但同时要求他们修改了你的代码必须回馈。这是商业公司与开源社区之间常用的妥协方案。
第三类:宽松“允许性”许可证(Permissive)
代表:MIT, Apache 2.0, BSD
- 核心特征:几乎可以做任何事,你可以修改、复制、再发布、闭源商用,唯一的要求通常是保留版权声明。
- 适合场景:你希望代码被最大范围地采用,不关心别人是否开源,甚至欢迎别人拿去闭源卖钱,只要他们保留你的署名。
- 主要区别(如何选):
- MIT:最简单、最宽松,只需保留版权声明和许可声明。95%的个人小项目、脚本、工具库都选它。
- Apache 2.0:比MIT多了一个专利授权条款,如果你在代码里包含了自己申请的专利,Apache 2.0意味着你自动授予了用户使用这些专利的许可。这是大公司(如Google、Apache基金会)的首选,能有效避免专利诉讼风险。
- BSD:有2-Clause、3-Clause版本,3-Clause禁止用你的名字或项目名称进行推广,流行度不如MIT和Apache。
绝大多数情况,选MIT,如果你在大公司或担心专利问题,选Apache 2.0。
快速决策流程图
你正在开发一个:
- 一个小工具、一个脚本、一个简单的库,或者写来玩的?
- 推荐:MIT(最简单,无负担)
- 一个可能被大公司集成的核心库?
- 担心他们不贡献改进?
- 是 -> LGPL 或 MPL 2.0
- 否 -> MIT 或 Apache 2.0
- 代码里有重要专利?选 Apache 2.0
- 担心他们不贡献改进?
- 一个操作系统、编译器、或希望强制所有衍生品开源的重大基础设施?
- 推荐:GPL 3.0(用AGPL 3.0覆盖网络服务场景)
- 一个只能通过Web提供服务(SaaS)的应用?
- 你介意AWS这种云厂商白嫖你的代码,却不公开他们改了什么(比如改个界面就卖钱)?
- 介意 -> AGPL 3.0(GPL的SaaS版,要求通过网络提供服务的修改也必须开源)
- 不介意 -> MIT / Apache 2.0
- 你介意AWS这种云厂商白嫖你的代码,却不公开他们改了什么(比如改个界面就卖钱)?
特别说明:CC 协议(Creative Commons)
- 许可证都是针对软件代码的。
- 如果你的作品是文档、图片、视频、字体,请用 CC 协议,不要用GPL或MIT。
- 常见选择:
- CC-BY:最宽松,署名即可。
- CC-BY-SA:署名且相同方式共享(类似GPL)。维基百科就用这个。
- CC0:放弃所有版权,相当于“公共领域”。
一个简单的建议
- 不清楚怎么选时,默认选MIT。 这是程序员的“国家通用语”,简洁明了,人人爱用。
- 如果你希望别人修改后也必须开源,选GPL。 但要做好别人因此绕道走的心理准备。
- 如果想做商业友好型库,选Apache 2.0。
- 不要自己发明许可证,也不要用什么“仅供学习交流”的非标准文字。 开源社区不认识你的协议,等于自绝于人群。
如果还是拿不准,可以在GitHub上创建一个仓库,在选择许可证时,GitHub会提供每个许可证的简短摘要说明,祝项目顺利。