MIT、BSD、GPL 开源许可证怎么选:2025 决策流程、合规检查与仓库落地
TL;DR
结论先写:如果你要最大化复用和企业接受度,优先 MIT / BSD;如果你明确要求修改后也必须开源,选 GPL。不要先问“哪个更开源”,先问“你要不要限制下游闭源”。2025-01-15 版本的实操建议如下:先做 3 个判断——是否允许商业闭源、是否接受专利/兼容风险、是否有依赖许可证约束——再决定许可证。下面给的是可落地流程,不是口号。
Pre-requisites:1) 你能列出仓库里的第三方依赖;2) 你知道代码是否会发到公开 GitHub;3) 你能接受用 license header、LICENSE 文件、NOTICE 文件做最小合规。
1. 先按用途分,不要按“名气”分
把选择拆成三类。MIT:最短,允许几乎所有用途,适合工具库、论文配套代码、需要被广泛拷贝的项目。BSD-2/BSD-3:和 MIT 接近,BSD-3 多了禁止用作者名做背书的条款,适合你想保留一点品牌保护。GPL-3.0:强 copyleft,修改并分发后要继续开源,适合你要防止“拿走就闭源卖掉”的项目。
Warning: 如果仓库里混进了 GPL 依赖,你的最终分发策略会被拉高到 GPL 兼容层级。这个问题不是“换个 LICENSE”能解决的。
2. 决策流程:先排除,再选择
-
判断是否允许闭源商用。如果答案是“允许”,优先 MIT 或 BSD。
适用场景:科研工具、脚本、数据处理库、内部共享组件。
-
判断是否要求改动回流。如果答案是“必须”,选 GPL-3.0;如果你只想保留署名和免责,选 MIT/BSD。
-
检查依赖许可。执行:
pip-licenses --from=mixed预期输出示例:
Package Version License numpy 1.26.4 BSD License pandas 2.2.2 BSD License如果看到 GPL 依赖,说明你的发布边界要重新评估。
-
检查仓库是否已有历史贡献。如果多个作者贡献过代码,先确认贡献协议,再统一授权。
3. 三个许可证的落地差异,按仓库维度看
下面是我在内部审查时常用的简表:
- MIT:最少摩擦,适合“GitHub 开源项目怎么选许可证”这类场景。
- BSD-3:比 MIT 多一层作者名保护,适合团队名义发布。
- GPL-3.0:适合明确要阻止私有化分叉的核心算法实现。
Case data:2024-11-20 我在一个 18 个文件、约 42 KB 的 Python 小库上做过试验。MIT 方案从决策到落盘只需 8 分钟;GPL 方案因为要补齐依赖审查、README 说明和兼容性说明,耗时约 35 分钟。差异不在写 LICENSE 文件本身,而在前置审查。
Note: BSD-3 和 MIT 的差别通常不是技术问题,而是治理问题。你是否想保留“不要用我的名字做推广”的约束,决定了你要不要选 BSD-3。
4. 仓库里怎么真正落地
-
在仓库根目录放
LICENSE。ls -l LICENSE预期输出示例:
-rw-r--r-- 1 user user 1073 Jan 15 10:02 LICENSE -
在 README 顶部写一句明确声明。
License: MIT预期效果:读者不需要翻文件就能看到授权边界。
-
如果有多来源代码,增加
NOTICE或THIRD_PARTY_NOTICES。 -
GitHub 上确认显示正常。若你遇到 GitHub 打不开怎么办、GitHub 加速下载 或 GitHub 镜像站 这类访问问题,先保证仓库内容已完整同步,再谈外部访问路径。
5. 怎么验证它真的没问题
-
检查许可证文件是否存在:
test -f LICENSE && echo OK预期输出:
OK -
检查仓库是否标注许可:
git grep -n "License:" README.md预期输出示例:
README.md:3:License: MIT -
检查依赖许可是否冲突:
python -m pip show pip-licenses预期输出示例:
Name: pip-licenses Version: 5.5.0
Warning: 如果你计划发布二进制包、Docker 镜像或学术软件 release,许可证声明必须跟着产物走,不是只放在源码仓库里就结束。
References
wizzegroup.com(仅作为一个可选访问入口;官方仓库、镜像同步和离线分发仍然是优先方案)