本文目录导读:

这个问题很关键,答案是:不一定,取决于你使用的开源许可证类型。
开源代码并不是“一刀切”地要求你必须开源自己的代码,是否需要开源,完全取决于代码作者选择的许可证(License)条款。
可以把开源许可证分为两大类:
强传染性许可证(Copyleft)—— 通常需要开源
这类许可证的核心要求是:如果你修改了代码,或者将其作为整体的一部分发布(尤其是以二进制形式),那么你的整个衍生作品也必须使用相同的许可证开源。
最常见的代表是GNU通用公共许可证(GPL,GNU General Public License)。
- 使用场景:你下载了一个GPL 3.0的库,修改了它,并集成了一个商业软件里,当你向客户发布这个商业软件时,你必须将这个商业软件的完整源代码(包括你写的部分)以GPL 3.0开源。
- 例外:如果你的软件只是在网络上提供服务,而没有分发软件本身(用GPL代码做后台API,用户通过浏览器访问),GPL通常不要求你开源服务端代码。AGPL(Affero General Public License,通用公共许可证) 专门堵住了这个漏洞,只要用户能通过网络使用你的软件,就必须开源。
- 常见许可:GPL 2.0 / 3.0、AGPL 3.0、LGPL(Library General Public License,较宽松,只要求对库本身的修改开源,动态链接的程序可以不开源)。
如果用了GPL/AGPL,你大概率需要开源你的整个项目。
宽松许可证(Permissive)—— 不需要开源
这类许可证非常“大方”,它只要求你在分发软件时保留原作者的版权声明和免责声明,但完全不要求你把基于它修改或衍生的代码开源,你可以用它写闭源的商业软件。
最常见的代表是MIT许可证、Apache 2.0许可证、BSD许可证。
- 使用场景:你用了MIT协议的JavaScript库(如React、Vue),用它开发了一个商业网站的后台,你把编译后的代码部署到服务器上,不需要公开你的源代码,你只需要在软件的某个地方(如README文件、关于页面)包含一行“本软件使用了基于MIT协议的XX库”即可。
- 常见许可:MIT、Apache 2.0、BSD 2/3-Clause、Unlicense(公共领域)。
用了MIT/Apache/BSD,你完全可以闭源,把代码做成商业软件卖钱。
特殊情况:只是“链接”或“调用”
- 动态链接:如果只是程序运行时动态调用一个LGPL的库,通常只要LGPL库本身开源,你的主程序可以不开源。
- 静态链接:通常会被视为衍生作品,需要遵守上游许可证。
- “不是作品”:如果你只是用了开源代码的算法思想,或者高度抽象的接口,而完全自己重写实现了功能,通常不需要遵守原许可证(但道德上建议注明来源)。
决策流程图(简版)
-
你是否修改了代码?(修改了,需要小心)
- 是 → 跳到问题2
- 否 → 跳到问题3
-
修改了什么?
- 只修改了开源库本身 → 根据库的许可证决定(GPL则开源整个项目;MIT则无需)。
- 写了新代码 → 如果是GPL传染,整个新代码也感染。
-
你如何分发你的软件?
- 内部使用 → 不需要开源。
- 通过网络提供服务 → GPL可能不要求,但AGPL要求。
- 发布二进制(如App、exe) → 必须遵守原始许可证,包括开源要求。
实战建议
- 看许可证文件:项目里通常有个
LICENSE或LICENSE.txt文件,这是最权威的依据。 - 使用代码扫描工具:用
FOSSA、WhiteSource或GitHub Dependabot扫描所有依赖库,它能自动识别每个库的许可证,并提示风险。 - 咨询法务:如果项目涉及商业机密或重要产品,强烈建议咨询专门做开源合规的律师,因为“是否构成衍生作品”在法律上可能有争议。
- 两个例外:
- 无许可证:没有许可证的文件默认禁止任何使用(包括复制),除非作者明确允许。
- “只读”模式:如果你只是阅读了别人的开源代码(即“学习知识”),而没有直接复制粘贴代码,通常不需要开源,但法律上界限模糊。
一句话总结: 想闭源,优先使用 MIT / Apache 2.0 / BSD 许可证的项目;除非你愿意承担开源义务,否则尽量远离 GPL / AGPL,开源不等于放弃商业,关键在于选对许可证。