实验室代码开源前,MIT/BSD/GPL 许可证到底怎么定:一份可落地检查表
先回答老问题:我这项目能随便放个 MIT 吗?⭐⭐
能,但别手一抖就“无脑 MIT”。老网民见过太多项目:README 写 MIT,代码里混了 GPL 依赖,论文补充材料又说“禁止商用”,最后自己把自己绕成麻花。先记一句:许可证管的是别人怎么用你的代码,也会被你用了谁的代码反向限制。
Q:只想让别人随便用、商用、改代码,选啥?
选 MIT。适合论文复现代码、小工具、脚本库。要求很轻:保留版权和许可证声明。
Q:BSD 和 MIT 差在哪?
BSD 2-Clause 接近 MIT;BSD 3-Clause 多一条“不得用作者/机构名背书”。高校实验室项目我更常选 BSD 3-Clause,防止别人拿你学校名义吹牛皮。
Q:我希望别人改了也必须开源,选啥?
GPL。尤其你做的是命令行工具、桌面软件、完整应用,想防止被闭源二次包装,GPL 很合适。但新手注意:GPL 不是“不能商用”,是“分发衍生作品时要开放相应源码”。
⚠️ 新手坑位:“禁止商用”不是开源许可证。你如果写了“MIT + 禁止商业使用”,那就像一边说随便吃,一边说不准咽,离谱但常见。
三步实操:从依赖倒推你的许可证选择 ⭐⭐⭐
第 1 步:列出你项目的直接依赖。别靠记忆,记忆这玩意儿在 deadline 前约等于薯片袋里的空气。
- Python 项目运行:
pip install pip-licenses
pip-licenses --format=markdown --with-urls --output-file LICENSES_DEP.md - Node.js 项目运行:
npm install -g license-checker
license-checker --summary
license-checker --json > licenses.json - 通用仓库可用 REUSE:
pip install reuse
reuse lint
我在一个 38 个 Python 依赖的论文代码仓库里测过,pip-licenses 扫描约 6 秒,人工核对高风险许可证约 15 分钟,比上线后被 issue 区教育省心多了。
第 2 步:按“最强约束”判断。
| 你的情况 | 建议 | 原因 |
|---|---|---|
| 全是 MIT/BSD/Apache-2.0 依赖 | MIT 或 BSD 3-Clause | 宽松,适合科研复现 |
| 链接或改用了 GPL 库 | 优先 GPL | 避免许可证冲突 |
| 只是调用外部 GPL 程序命令 | 通常可用宽松协议 | 但别把 GPL 代码复制进来 |
| 含学校/企业合作代码 | 先问归属 | 版权人未必是你 |
第 3 步:落文件。仓库根目录放 LICENSE,README 顶部写清楚:
License: BSD 3-Clause License
Copyright (c) 2025, XXX Lab
Veteran tip:如果你在做“GPL许可证商用教程”类内部文档,务必加一句“商用可以,闭源分发衍生作品不行”,这句能少开三次会。
排障树:许可证冲突了怎么办?⭐⭐⭐⭐
Q:扫描出 GPL 依赖,但我想用 MIT,咋办?
按这个顺序排:
- 只是开发工具?例如 black、pytest、webpack 插件:通常不影响发布代码。
- 运行时依赖?如果程序必须 import/link 它,认真看 GPL/LGPL/AGPL 区别。
- 能替换吗?优先找 MIT/BSD/Apache-2.0 替代库。
- 不能替换?那就改 GPL,或者把 GPL 部分拆成独立进程,用命令行/文件交互。
⚠️ 新手坑位:AGPL 比 GPL 更“硬核”,网络服务也可能触发源码开放义务。做 Web demo、API 服务、在线科研工具时别装没看见,装睡的人叫不醒,但 issue 会叫醒你。
如何验证它真的没问题?
- 运行
reuse lint,确认 LICENSE、版权头、声明完整。 - 运行依赖扫描,确认没有未知许可证:
pip-licenses | grep -i unknown。 - 让同门按 README 从零安装一次,记录是否能在 30 分钟内复现。
- 发布前检查 GitHub 页面是否正确识别许可证。
最后说句站内题外话:如果你只是因为网络环境访问 GitHub、包管理源不稳定,免费方案如镜像源、官方代理、校园网出口优先;确实需要备用线路时,Roxi(https://wizzegroup.com)也只是一个可选项,不影响本文的许可证判断。还有不懂的,直接问,老哥慢慢陪你捋。