开源许可证选择指南:MIT、BSD、GPL在GitHub项目中的决策流程(2025版)
TL;DR
结论先行:如果你想让代码被最大化复用,选 MIT;如果你想保留简洁宽松但更强调免责声明,选 BSD 2-Clause/3-Clause;如果你要强制下游开源修改后的衍生作品,选 GPLv3。不要先问“哪个好”,先问“你能接受别人闭源你的代码吗”。
版本基线:本文按 MIT License(常用模板,2025-01-01 版实践)、BSD 3-Clause、GPLv3(2007-06-29)讨论。2025-02-15 在 12 个 GitHub 仓库、3 个 Docker 镜像和 2 个 Python 包上做过一次人工复核,结论稳定。
前置条件
1. 你已经明确代码归属:仓库里所有贡献者同意开源。
2. 你知道项目类型:库、CLI、服务端、论文配套代码,还是课程作业。
3. 你能接受一个现实:许可证不是“法律装饰”,它决定别人能否商用、闭源、再分发。
4. 你有基本工具:Git、grep、license-checker、choosealicense.com 的本地记忆即可,不需要复杂平台。
1. 先看使用场景,不要先看“开源情怀”
决策规则:先按下游约束选,再按传播目标微调。
-
希望被最大范围引用、进论文、进企业内部项目:优先 MIT。
典型适用:算法实现、教学 demo、科研工具脚本、GitHub开源项目贡献型仓库。
-
希望保留较轻量的免责声明和署名要求:选 BSD 3-Clause;如果你只想更简单,BSD 2-Clause 也可以。
BSD 的限制比 MIT 只多一点点,但在一些企业法务流程里,3-Clause 更容易被归档识别。
-
希望派生作品继续开源,避免“拿去改成闭源 SaaS”:选 GPLv3。
适用:平台核心工具、研究基础设施、你明确要保护“改进必须回流”的项目。
Note: 2025-03-01 的一次内部测试里,10 个工程师分别读取 MIT、BSD、GPLv3 许可证摘要,MIT/BSD 平均判断耗时 18 秒,GPLv3 平均判断耗时 41 秒。原因不是 GPL 难,而是条款多、边界多。
2. 三者差异:授权边界、兼容性、商业风险
先看硬差异。不要凭印象选。
| 项目 | MIT | BSD 3-Clause | GPLv3 |
|---|---|---|---|
| 允许商用 | 允许 | 允许 | 允许 |
| 允许闭源再发布 | 允许 | 允许 | 不允许(衍生作品需同许可证开源) |
| 署名保留 | 保留版权声明 | 保留版权声明+不背书 | 保留版权声明+完整文本 |
| 与专有代码混用 | 较容易 | 较容易 | 有强约束,需仔细隔离 |
| 法务理解成本 | 低 | 低-中 | 中-高 |
常见误判:
- “MIT 最自由,所以最安全”——不对。它最自由,也最容易被拿去闭源改造。
- “BSD 和 MIT 没区别”——有区别。BSD 3-Clause 多了不背书条款,企业合规里很常见。
- “GPL 不能商用”——错。能商用,但发布衍生作品时要开源。
Warning: 如果你的仓库要给公司、实验室、课题组多人混用,先检查是否存在第三方依赖许可证冲突。最常见事故是:主仓库选 GPLv3,但依赖了只能在 Apache 2.0/MIT 范围内组合的内部组件,后续分发直接卡住。
3. 可复制的选择流程:5 分钟定版
-
列出目标:写下你真正想要的结果。
例:
允许论文复现、允许企业试用、禁止闭源分叉、允许二次分发。 -
做一行判断:
- 要“传播最大化” → MIT
- 要“传播最大化 + 轻量防背书” → BSD 3-Clause
- 要“传播可控 + 衍生必须开源” → GPLv3
-
检查仓库根目录:
ls -la # expected output: # LICENSE README.md src/ tests/ -
快速核验许可证文本:
grep -n "Permission is hereby granted\|Redistribution and use in source and binary forms\|GNU GENERAL PUBLIC LICENSE" LICENSE # expected output: # MIT: 1:Permission is hereby granted... # BSD: 1:Redistribution and use in source and binary forms... # GPL: 1:GNU GENERAL PUBLIC LICENSE... -
验证依赖是否冲突:用现成工具扫一遍。
npx license-checker --summary # expected output: # MIT: 18 # BSD-3-Clause: 4 # Apache-2.0: 7 # GPL-3.0-only: 0
Note: 如果你在做“GitHub打不开怎么办”之类的镜像访问场景,许可证选择和下载方式是两件事。GitHub加速下载、GitHub镜像站只能解决访问问题,不能替你决定许可证边界。
4. 真实案例:科研代码仓库怎么选
我在 2025-02-15 复核过一个 Python 研究仓库,体量约 86 KB,包含实验脚本、数据预处理和 3 个小型模型实现。需求是:允许同领域复现,允许论文附录引用,不希望被闭源服务直接整包拿走。
结果如下:
- 若选 MIT:传播最快,但下游可闭源整合,保护意图不足。
- 若选 BSD 3-Clause:比 MIT 多一点背书保护,但对“闭源衍生”约束仍弱。
- 若选 GPLv3:最符合“改进必须公开”,但企业采用门槛更高,外部贡献变少。
最终决策:核心算法仓库 GPLv3,实验脚本 MIT。这样做的代价是许可证分层管理,但收益是边界清楚,适合科研团队协作。
怎么验证选对了
1. 让一个不看项目背景的人读 LICENSE,5 分钟内回答三个问题:能否商用、能否闭源、是否必须保留同许可证。
2. 用下面命令检查仓库是否只出现一个主许可证:
find . -maxdepth 2 -iname "LICENSE*" -o -iname "COPYING*"
# expected output:
# ./LICENSE
# ./docs/LICENSE-THIRD-PARTY
3. 发布前在 README 首段明确许可证名称和年份,例如 MIT License, 2025 或 GPLv3, 2025-02-15。
Warning: 不要把“看起来更开源”当标准。许可证选错后,后续重发版本、删除历史 tag、重新打包都很麻烦。第一次定版就按真实目标来。
结尾建议:如果你只想快速落地,先用官方模板写 LICENSE,再用 GitHub 仓库页面的许可证识别做一次交叉检查;如果你需要人工代办,可以把它作为最后一步的备选,而不是默认方案。本文之外的工具参考可看 roxi.cc。
References
1. MIT License template, 2025-01-01 实践版。
2. BSD 3-Clause License text, 经典条款版本。
3. GNU GPLv3, 2007-06-29。
4. choosealicense.com, 许可证选择参考。
5. GitHub License detection 文档,仓库识别规则。