1. 开源许可证生态全景

在讨论“能不能把这段开源代码放进商业产品”之前,必须先回答一个更基础的问题:什么算开源。很多人把“源码公开可见”等同于开源,这是最常见的误解。按照开放源代码促进会(OSI)的定义,一个许可证只有同时满足十项条件,才配得上“开源许可证”这个称号,其中最关键的几条是:允许任何人自由再分发、必须提供源代码或可获取源代码的途径、允许修改和派生作品、不得歧视任何个人或群体、不得限制衍生作品的使用领域。换句话说,“能看见源码”只是必要条件,不是充分条件;一份只允许阅读、禁止商用的“源码可见许可证”,在 OSI 口径下并不属于开源许可证。

理解这一点后,再看整个许可证生态,就不会被五花八门的名字迷惑。业界通常用两条主轴来给许可证分类:一是传染性(copyleft)的强弱,二是是否修改后必须开源。宽松型许可证(Permissive)几乎不限制衍生作品的授权方式,典型代表是 MIT、BSD、Apache-2.0;弱传染型(Weak Copyleft)只要求被修改的那部分库本身保持开源,典型是 LGPL、MPL-2.0;强传染型(Strong Copyleft)则要求整个衍生作品都以相同许可证发布,典型是 GPL-2.0、GPL-3.0、AGPL-3.0。下面这张图把常见许可证按“传染强度—商用友好度”两个维度铺开,并标出它们对商业项目最直接的影响点。

开源许可证生态图谱:传染强度 × 商用友好度 传染性 / 开源义务强度 → 商用友好度 → 宽松型 Permissive 弱传染 Weak Copyleft 强传染 Strong Copyleft MIT / BSD 保留版权声明即可商用 Apache-2.0 含专利授权与商标限制 ISC / Zlib 极简宽松,义务最少 LGPL-2.1 / 3.0 动态链接可闭源调用 MPL-2.0 仅修改文件需开源 EPL-2.0 文件级传染,商业友好 GPL-2.0 / 3.0 衍生作品整体须开源 AGPL-3.0 网络服务也触发开源 SSPL / BSL 非 OSI 开源,商用受限 越靠右:开源义务越强,闭源商用风险越高;越靠上:商用限制越少,集成越自由

图中最需要商业项目警惕的是右侧红色区域。GPL 系列的核心逻辑是“以开源换开源”:只要你分发的作品构成了 GPL 程序的衍生作品,整个作品就必须以 GPL 发布并提供完整源码。AGPL 更进一步,把“通过网络提供服务”也视为分发,这意味着把 AGPL 组件放进 SaaS 后端,也可能触发向用户提供源码的义务。而 SSPL、BSL 这类许可证虽然源码可见,却因附加了商用限制,并不被 OSI 认可为开源许可证,使用前必须单独评估授权条款。

接下来要厘清一个常被混用的概念:自由软件(Free Software)与开源软件(Open Source)的区别。两者在“用户可以自由使用、研究、修改、分发”这一实践层面高度重叠,绝大多数许可证同时被自由软件基金会(FSF)和 OSI 认可。但它们的出发点不同:自由软件运动由 FSF 发起,强调这是关乎用户自由的伦理问题,因此 FSF 明确反对 DRM、反对软件专利、反对把“开源”当作纯粹的开发方法;而 OSI 的开源定义更偏向工程与商业协作,强调开放开发流程能带来更高质量的软件。这一差异直接体现在许可证态度上:FSF 推荐 GPL 系列,认为宽松许可证无法保护用户自由;OSI 则对宽松与传染型一视同仁。对商业团队而言,理解这层差异的意义在于——不要用“它是开源的”来推断“它没有使用限制”,具体义务永远以许可证原文为准。

那么,许可证选择到底如何影响一个商业项目?可以从三个真实决策点来看。

第一,分发方式决定义务触发点。如果公司只是内部使用某 GPL 工具、不对外分发,通常不触发 GPL 的源码提供义务;但一旦把包含 GPL 代码的固件烧进硬件出货,或把 GPL 库静态链接进对外发布的 App,就必须提供对应源码。这也是为什么很多企业在引入 GPL 组件前,会先确认“是否会分发”。

第二,链接方式影响传染范围。以 LGPL 为例,动态链接调用 LGPL 库时,主程序可以保持闭源,但必须允许用户替换该库的新版本;若改为静态链接,则往往需要提供目标文件或采用其他方式让用户能够重新链接。这个区别在嵌入式与客户端项目中尤为关键。

第三,许可证兼容性决定能否混用。不同许可证的义务可能互相冲突。例如把 GPL-2.0-only 代码与 Apache-2.0 代码合并,就可能因专利条款与版本条款的冲突而无法合法分发;而 GPL-3.0 与 Apache-2.0 则通常兼容。下表给出一个简化的兼容性速查示例,实际项目仍应以许可证原文和法务意见为准。

组件 A 许可证组件 B 许可证能否合并分发关键原因
MITGPL-3.0可以宽松型可被更强义务吸收
Apache-2.0GPL-2.0-only通常不可以专利与版本条款冲突
Apache-2.0GPL-3.0可以GPL-3.0 明确兼容 Apache-2.0
GPL-2.0-onlyGPL-3.0不可以only 版本不授权升级
MPL-2.0GPL-3.0可以MPL 允许次级许可
识别许可证时,优先看项目根目录的 LICENSE / COPYING 文件与源码文件头声明;若两者不一致,以更严格或更明确的声明为准,并记录证据。SPDX 标识符(如 MIT、Apache-2.0、GPL-3.0-only)是机器可读的准确写法,建议在内部组件清单中统一使用。