什么是开源协议

开源协议是一种法律文件,它规定了开源软件的使用者、修改者和分发者在使用、修改和分发该软件时的权利和义务。其核心目的是在保护版权的同时,推动软件的共享和创新。

开源协议本质上是版权所有者对软件使用、修改、分发的规则定义,以下是 GitHub 上最常用的协议类型:

image-20250614185512976
image-20250614185526130

开源协议有 LGPL,Mozilla,GPL,BSD,MIT 和 Apache。

核心条款包括

条款类型 具体内容
商业使用 是否允许将开源软件用于商业产品或服务(如 MIT、Apache 允许,CC-BY-NC 禁止)。
衍生作品开源 是否要求修改后的代码或衍生作品必须开源(如 GPL 强制开源,MIT 无此限制)。
版权声明 是否必须保留原作者的版权和许可声明(几乎所有协议均要求)。
专利授权 是否包含专利授权条款,避免用户因使用代码而被起诉(如 Apache 2.0、GPL 3.0)。
商标限制 是否禁止未经允许使用项目商标进行宣传(如 Apache 2.0 明确商标使用规则)。

开源协议的核心作用

  1. 明确权利边界: 规定用户是否可以自由使用、修改、分发软件,以及是否允许商业用途等。例如,有些协议允许闭源商业使用,而有些则要求衍生作品必须开源。
  2. 保护开发者权益: 通过版权声明和条款约束,防止他人滥用代码(如去除原作者信息、专利侵权等)。
  3. 促进开源生态: 通过 “传染性” 条款(如 GPL)强制衍生作品开源,确保开源代码持续贡献给社区,避免被闭源垄断。

主流开源协议类型

MIT 协议(Massachusetts Institute of Technology License)

最宽松的协议之一,允许任何人自由使用、修改、分发代码,包括商业用途。只需要保留原始的版权声明和许可证声明。几乎没有其他限制,是最受欢迎的选择之一。

  • 核心特点

    • 最宽松的商业友好型协议,允许自由使用、修改、分发软件(包括闭源商业产品)。
    • 唯一强制要求:保留原始版权声明和许可证文本(通常只需在项目中包含 LICENSE 文件)。
    • 无附加限制:无需标注修改内容,无需提供源码,无专利授权要求。
  • 适用场景

    • 个人项目或工具库(如 React、Babel),希望代码被广泛复用且无需关注后续用途。
    • 快速迭代的商业产品(如 SaaS 服务),需集成开源组件但不希望被协议约束。
  • 法律风险

    • 若代码存在专利侵权,原作者不承担责任(需自行确保合规)。

Apache 2.0 协议

类似MIT但更详细,提供专利保护。允许商业使用、修改和分发,要求保留版权声明、许可证声明和变更说明。如果修改了代码,需要明确标注修改内容。

  • 核心特点

    • 专利保护:自动授予用户使用代码相关专利的权利,防止后续专利诉讼(如 Google vs. Oracle 的 Java API 案中,Apache 协议的代码被判定受保护)。
    • 需明确标注修改:修改代码时需在文件中添加变更说明(如 This file was modified by John Doe)。
    • 商标限制:禁止用原项目商标进行商业宣传(如不能声称 “官方认证”)。
  • 适用场景

    • 企业主导的大型开源项目(如 Apache Hadoop、Kubernetes),需平衡开源与商业利益。
    • 涉及专利技术的软件(如 AI 算法库),降低用户法律风险。
  • 与 MIT 的对比

    • Apache 2.0 更适合 “企业级协作”,而 MIT 更适合 “个人或小型团队快速分发”。

GPL 协议(GNU General Public License)

GNU通用公共许可证,分为GPLv2和GPLv3版本。这是”传染性”协议,要求任何基于GPL代码的衍生作品也必须使用GPL协议开源。适合希望确保代码永远保持开源的项目。

  • 核心特点

    • 强传染性(Copyleft):基于 GPL 代码的衍生作品(包括修改或集成)必须采用 GPL 开源,且需提供完整源码。
    • 版本迭代:GPLv3 比 v2 更严格,新增对 Tivo 化(硬件锁定软件)的限制,明确涵盖网络服务(如通过 API 远程使用需开源)。
  • 适用场景

    • 纯开源项目(如 Linux 内核、Git),确保代码永不闭源。
    • 抵制商业公司将开源代码私有化(如 GPLv3 针对 DRM 技术的限制)。
  • 法律风险

    • 严格的传染性:若将 GPL 代码集成到闭源产品,整个产品需开源(典型案例:SCO vs. Linux 社区)。

LGPL 协议(GNU Lesser General Public License)

GNU宽松通用公共许可证,比GPL宽松一些。允许其他项目通过动态链接的方式使用LGPL代码而不必开源整个项目,但如果直接修改LGPL代码则需要开源修改部分。

  • 核心特点

    • 弱传染性:允许闭源软件通过动态链接(如.dll、.so 文件)使用 LGPL 库,无需开源主程序。
    • 修改限制:若直接修改 LGPL 库本身,则修改部分需开源。
  • 适用场景

    • 开发通用库(如 FFmpeg、Qt),希望商业公司无需开源主程序即可使用。
    • 嵌入式系统(如车载软件),需集成开源库但受硬件限制无法公开全部源码。
  • 与 GPL 的对比

    • LGPL 是 “库友好型”,GPL 是 “完全开源型”。

BSD 协议(Berkeley Software Distribution)

有2-Clause和3-Clause两个版本。2-Clause版本类似MIT,3-Clause版本增加了不能使用原作者名字做宣传的条款。都允许商业使用且限制很少。

  • 核心特点

    • 极简条款:允许商业使用、修改、分发,仅需保留版权声明。
    • 3-Clause 版本:新增 “不得用原作者 / 机构名义宣传” 条款(如避免被用于虚假广告)。
  • 适用场景

    • 学术项目或早期创业公司(如 Redis 采用 3-Clause BSD),希望代码被广泛使用且无法律负担。
    • 与 MIT 类似,但 BSD 的 “不得用于宣传” 条款更适合注重品牌的机构。
  • 典型争议

    • 2004 年,加州大学因 BSD 协议无法阻止 NetBSD 被用于商业产品,后转向更严格的协议。

Mozilla Public License (MPL 2.0)

介于MIT和GPL之间的协议。文件级别的copyleft,即修改MPL协议覆盖的文件需要开源,但可以与其他协议的文件组合使用。

  • 核心特点
    • 文件级 Copyleft:仅修改过的 MPL 文件需开源,未修改的文件可保持闭源(如 Firefox 浏览器核心开源,插件可闭源)。
    • 专利保护:明确专利授权,且禁止贡献者撤回授权(防止 “专利 ambush”)。
  • 适用场景
    • 混合开源 / 闭源的大型项目(如 Mozilla Firefox),允许第三方插件闭源。
    • 企业希望部分代码开源以吸引社区贡献,同时保留核心模块闭源。
  • 与 GPL 的对比
    • MPL 更灵活,GPL 更 “all-or-nothing”。

Boost Software License 1.0

  • 核心特点:极其宽松,允许自由使用、修改、分发,包括商业场景。几乎无限制,只需保留版权声明,且不承担因代码使用产生的责任。
  • 适用场景:适合希望代码完全自由传播的小型工具库、个人项目,比如一些轻量级的算法实现代码 。
  • 对比其他:比 MIT 更宽松,MIT 还需保留版权声明,它在责任豁免等方面更 “彻底”,不过知名度相对低,Boost 库生态常用。

Creative Commons Zero v1.0 Universal(CC0)

  • 核心特点:作者主动放弃作品的版权(将作品放入公共领域),他人可无任何限制地使用、修改、商用,无需署名(当然署名更道德) 。
  • 适用场景:非软件内容(如文档、图片、创意素材)开源分享,也用于开发者明确要完全 “放权” 的代码,比如公益性质、纯共享的代码片段 。
  • 注意点:涉及专利等复杂权益时,CC0 不一定能覆盖,且不同国家对 “公共领域” 的法律界定有差异,软件项目用它需谨慎。

Eclipse Public License 2.0(EPL 2.0 )

  • 核心特点:允许商业使用、修改代码,衍生作品若分发,需开源修改部分;有专利授权条款,保护贡献者和使用者;要求保留版权声明 。
  • 适用场景:Eclipse 生态项目,以及企业想部分开放代码、又想控制衍生代码开源范围的场景,比如某些工具类中间件开发 。
  • 对比 MPL:和 MPL 类似都是 “文件级开源要求”,但 EPL 在专利条款、社区生态(关联 Eclipse 平台)上有差异,对想融入 Eclipse 生态的项目更适配。

GNU Affero General Public License v3.0(AGPLv3 )

  • 核心特点:继承 GPL 强传染性,不仅修改、分发衍生作品要开源,通过网络提供服务(如 SaaS 调用代码功能) ,也需开源服务端修改后的代码;注重保护网络环境下的开源权益 。
  • 适用场景:云服务、Web 应用类开源项目,防止企业用开源代码做闭源 SaaS 服务,比如开源的协作工具、云存储项目 。
  • 对比 GPLv3:GPLv3 主要管 “分发软件行为”,AGPLv3 把 “网络使用并提供服务” 也纳入开源要求,更贴合互联网服务场景。

GNU General Public License v2.0(GPLv2 )

  • 核心特点:强传染性,衍生作品必须开源且用 GPLv2;相比 GPLv3,对专利授权、网络服务场景的约束没那么细,条款更简洁 。
  • 适用场景:Linux 内核早期用的就是 GPLv2,适合追求传统强开源、又不想被复杂条款束缚的项目,不过因条款相对 “老”,现代项目选 GPLv3 更多 。
  • 争议点:GPLv2 和 GPLv3 不兼容(代码混用会有协议冲突),若项目要融合不同 GPL 版本代码,需特别处理。

GNU Lesser General Public License v2.1(LGPLv2.1 )

  • 核心特点:弱传染性,闭源项目可通过动态链接(如调用.so 库文件)使用 LGPLv2.1 代码,无需开源主项目;但修改 LGPLv2.1 代码本身,修改部分要开源 。
  • 适用场景:开发通用函数库、工具包,希望被闭源项目集成使用,又想保证库自身的开源迭代,比如一些图形处理、数学计算库 。
  • 对比 LGPLv3:LGPLv3 对专利、动态链接的细节约束更严,LGPLv2.1 更 “宽松老旧”,部分 legacy 项目还在用。

The Unlicense

  • 核心特点:作者放弃全部版权,代码进入 “公共领域”,他人可随意使用、修改、商用、闭源,无需保留任何声明(连版权声明都不用留,当然留了更尊重原作者 )。
  • 适用场景:开发者想彻底 “放手”,让代码完全自由传播,比如个人玩票性质、对版权毫不在意的极小项目 。
  • 风险点:法律上,“公共领域” 在不同国家认定有差异,且一旦代码进入公共领域,作者无法再控制后续使用(包括被恶意利用),商业项目用它需极度谨慎,可能因法律模糊引发纠纷 。

主要区别

商业使用友好度:MIT、Apache、BSD最友好,GPL系列要求衍生作品也开源,MPL居中。

传染性强度:GPL传染性最强(整个项目),LGPL和MPL是部分传染性,MIT/Apache/BSD无传染性。

专利保护:Apache 2.0和MPL提供明确的专利授权,MIT和BSD没有明确说明。

使用要求:GPL系列要求衍生作品开源,其他协议主要要求保留版权声明。

选择协议时,如果希望代码被广泛使用包括商业项目,MIT或Apache是好选择;如果希望确保代码修改后仍然开源,可以选择GPL;如果想要平衡的话,MPL是不错的中间选项。

以下直观的给大家看下开源协议的区别

flowchart TD
    A["他人修改源码后是否可以闭源"]
    A -->|Yes| B["每个修改文件是否必须放置版权说明"]
    A -->|No| C["新增代码是否采用同样许可证"]
    B -->|Yes| D["Apache许可证"]
    B -->|No| E["衍生软件广告是否可以用你的名字促销"]
    E -->|Yes| F["MIT许可证"]
    E -->|No| G["BSD许可证"]
    C -->|Yes| H["GPL许可证"]
    C -->|No| I["是否需要对源码修改提供说明文档"]
    I -->|Yes| J["Mozilla许可证"]
    I -->|No| K["LGPL许可证"]