Language:Chinese VersionEnglish Version

大多数开发者与开源许可证的互动方式,就像大多数人使用服务条款一样:直接滚动跳过。这通常没什么问题,直到问题出现——直到贵公司的法务团队询问你的依赖树中有哪些许可证,直到 GPL 库出现在你的专有 SaaS 产品中,或者直到你需要为自己的项目选择许可证,却发现不了解其中的差异。

许可证不是可选的。你使用的每款开源软件都附带法律条款,这些条款影响着你可以如何处理你的代码。理解这些条款不是为了成为律师;而是为了做出明智的决定,避免六个月后出现麻烦。

编辑评论: 许可证是开发者们会一直回避的话题,直到变得紧急。Michael 提供了你做出良好决策所需的实用理解——不需要法学学位,但也绝非危险的过度简化。

你需要了解的核心概念

在比较特定许可证之前,你需要理解两个基本概念,它们决定了许可证如何影响你的工作。

宽松型 vs. 著作权共享型

宽松型许可证(MIT、Apache 2.0、BSD)说:”你可以随意使用这段代码,只需保留版权声明即可。”你可以在专有软件中使用宽松型许可证的代码,修改它,重新分发它,销售基于它的产品。唯一的义务是署名——通常在你的分发中保留许可证文件。

著作权共享型许可证(GPL、AGPL、LGPL、MPL)说:”如果你分发包含或源自此代码的软件,分发的软件也必须以相同的许可证提供。”其目的是确保开源软件的改进保持开源。实际影响是,如果你不注意边界,著作权共享型代码可能会”感染”你的专有代码库。

分发触发条件

大多数许可证义务是由分发触发的——将软件提供给他人。在自己的服务器上运行 GPL 许可的代码通常是没问题的,即使用于专有目的,因为你没有分发它。AGPL 特别通过将分发触发条件扩展到网络交互来关闭这个”漏洞”:如果用户通过网络与 AGPL 软件交互,他们有权获得源代码。

这一区别对 SaaS 公司来说极为重要。SaaS 产品可以在内部使用 GPL 库而无需开源任何东西,因为软件从未分发——用户通过 HTTP 与其交互。但 AGPL 完全改变了这一等式。

主要许可证的实际解释

MIT 许可证

MIT 许可证是最流行的开源许可证,而且理由充分:它简短(约170个单词)、易于理解,并且具有最大的许可性。只要包含版权声明和许可证文本,您基本上可以对 MIT 许可的代码做任何事。

何时使用:当您希望获得最大程度的采用,并且不介意有人在专有产品中使用您的代码时。大多数 JavaScript/TypeScript 库、许多 Rust 软件包以及 Python 生态系统的大部分都使用 MIT 许可证。

注意事项:MIT 不提供专利保护。如果代码实现了受专利保护的算法,版权许可证并不授予您专利许可证。在实践中,这对小型项目来说很少重要,但对于企业采用涉及专利领域的代码来说,这是一个真正的顾虑。

Apache 许可证 2.0

Apache 2.0 在许可性方面与 MIT 类似,但增加了两个重要条款:明确的专利授予和贡献协议。当有人根据 Apache 2.0 发布代码时,他们授予您对其持有的任何被代码必然侵犯的专利的许可。这种专利保护是许多公司和基金会更倾向于选择 Apache 2.0 而非 MIT 的原因。

贡献条款意味着任何为 Apache 2.0 项目贡献的人都会自动为其贡献授予相同的专利许可。这创造了一个清晰的知识产权链条,法律团队对此表示赞赏。

何时使用:当您希望获得具有专利保护的许可性许可证时。Kubernetes、TensorFlow 和大多数 Apache 基金会项目都使用此许可证。如果您的项目可能被具有专利敏感法律团队的企业采用,Apache 2.0 可以消除一个潜在的反对意见。

注意事项:Apache 2.0 与 GPLv2 不兼容(但与 GPLv3 兼容)。如果您需要将代码与仅限 GPLv2 的库结合使用,Apache 2.0 会造成冲突。这是一个小众问题,但值得了解。

GPL(v2 和 v3)

GNU 通用公共许可证是原始的 copyleft 许可证,也是最具哲学观点的许可证。其核心原则:如果您分发包含 GPL 代码的软件,整个组合作品必须在 GPL 下分发,并提供源代码。

GPLv2 是较旧的版本,被 Linux、Git 和许多基础项目使用。它要求分发的二进制文件提供源代码可用性,但对”衍生作品”的定义更为狭窄。

GPLv3 增加了对 Tivoization(使用硬件限制阻止用户运行修改过的软件)的防护,并有更清晰的专利措辞。它在某些方面更具限制性,但与 Apache 2.0 更兼容。

SaaS 漏洞: GPL 义务在分发时触发。如果您将 GPL 软件作为服务运行,用户仅通过网络与之交互,那么您并未分发该软件。许多 SaaS 公司因此内部使用 GPL 库。

何时使用: 当您希望确保衍生作品保持开源时。如果您认为您的软件足够有价值,以至于公司会在其上构建专有产品,GPL 可确保他们做出贡献回馈。

注意事项: GPL 的 copyleft 要求是许可证合规问题最常见的来源。如果您专有应用程序中的任何依赖项是 GPL(非 LGPL,也非系统库例外),您就存在潜在问题。请审核您的依赖树。

AGPL (Affero 通用公共许可证)

AGPL 是 GPL 的一个关键补充:如果用户通过网络与软件交互,这被视为分发。这关闭了 SaaS 漏洞。如果您修改了 AGPL 软件并通过 HTTP 向用户提供服务,您必须提供您修改版本的源代码。

何时使用: 当您希望防止 SaaS 公司使用您的软件而不做出贡献回馈时。MongoDB 的原始许可证是 AGPL(在他们切换到 SSPL 之前)。许多开发者工具使用 AGPL 来确保云提供商不能在不开源其修改的情况下提供托管版本。

注意事项: AGPL 是让企业法务团队最紧张的许可证。许多公司有全面禁止 AGPL 依赖项的政策。如果您将项目许可为 AGPL,您将限制企业采用——这可能或可能不是您的意图。

LGPL (较宽松通用公共许可证)

LGPL 是 GPL 和宽松许可证之间的折衷方案。它允许专有软件链接到 LGPL 库,而无需将 copyleft 要求传播到专有代码。义务有限:如果您修改 LGPL 库本身,这些修改必须共享。但您仅使用该库的应用程序代码仍归您所有。

何时使用: 当您希望您的库能在专有软件中使用,但又希望对库本身的修改保持开放时。许多 C/C++ 库使用 LGPL(如 glibc、Qt 的开源版本)。

MPL 2.0 (Mozilla 公共许可证)

MPL 2.0 是文件级别的 copyleft 许可证。对 MPL 许可文件的修改必须以 MPL 方式共享,但您可以在同一项目中将 MPL 文件与专有文件结合,而不会将 copyleft 要求传播出去。这使其成为一个务实的中间地带——对修改的限制比 MIT/Apache 更严格,但对组合作品的限制远不如 GPL 严格。

何时使用:当您希望对代码的修改能够共享,但不希望阻止专有使用时。Firefox、Terraform(在切换到BUSL之前)以及HashiCorp的早期工具都使用了MPL。

新许可证:BUSL、SSPL及源码可用运动

过去几年,我们看到一波项目从传统开源许可证转向”源码可用”许可证,后者限制特定的商业用途。根据OSI的定义,这些不是开源许可证,但源代码是公开可用的。

商业源码许可证(BUSL):允许大多数使用,但限制特定的商业活动(通常是将软件作为托管服务提供)。在设定的时间段后(通常是3-4年),代码会转换为宽松的开源许可证。MariaDB、HashiCorp(Terraform、Vault)和Sentry使用此许可证。

服务器端公共许可证(SSPL):MongoDB的许可证,要求任何将软件作为服务提供的人必须开源其整个服务堆栈。故意设计得过于严格,使云提供商无法遵守。

这些许可证是对”开源可持续性”问题的回应:公司构建价值数十亿美元的业务,却不对开源软件做出贡献。它们是否是正确的回应,在社区中是一个真正的辩论话题。

对于使用这些工具的开发者:实际应用中,请将BUSL和SSPL视为专有许可证。在建立依赖关系之前,请仔细检查具体限制。对于选择许可证的开发者:要理解这些许可证以商业保护为代价,降低了采用率和社区贡献。

实际决策框架

为您的项目选择许可证时,请按顺序问以下问题:

  1. 您是否在意有人在专有产品中使用您的代码? 否:使用MIT或Apache 2.0。是:继续问题2。
  2. 您特别在意SaaS使用吗? 否:使用GPL。是:使用AGPL。
  3. 您需要专利保护吗? 是:优先选择Apache 2.0而非MIT。随着项目的发展和吸引企业用户,这一点变得更加重要。
  4. 您是在构建库还是应用程序? 库通常受益于宽松许可证(更广泛的采用)。应用程序可以使用Copyleft许可证,因为它们是最终产品,不是依赖项。

对于大多数发布副项目、库或工具的开发者:MIT或Apache 2.0。如果简单性很重要,选择MIT。如果专利保护很重要,选择Apache 2.0。绝大多数开源软件使用这两种许可证之一,并且有充分的理由。

审核您的依赖项

了解自己的许可证只是问题的一半。你还需要知道依赖树中存在哪些许可证。专有应用程序中的单个 GPL 依赖项就是一个合规问题,而传递性依赖则是隐藏惊喜的地方。

有帮助的工具:

  • license-checker (npm):扫描你的 node_modules 并报告每个许可证。
  • pip-licenses (Python):对 pip 包执行相同操作。
  • cargo-license (Rust):列出所有 crate 依赖项的许可证。
  • FOSSA / Snyk:提供持续许可证监控和合规报告的商业工具。

在首次生产发布前运行许可证审计,并将其添加到你的 CI 管道中,以便在新的许可证进入依赖树时能够捕获它们。一个五分钟的 CI 检查比事后的法律审查更便宜。

关键要点

  • 宽松型许可证(MIT、Apache 2.0)允许你在注明出处的情况下几乎做任何事。著作权许可证(GPL、AGPL)要求衍生作品必须使用相同的许可证。
  • GPL 义务在分发时触发,而非使用时。在服务器上运行 GPL 软件提供 SaaS 服务通常没问题——但 AGPL 通过将网络交互视为分发来填补这一空白。
  • 当专利保护重要时,选择 Apache 2.0 而非 MIT。当简单性是你的优先考虑时,选择 MIT。对于大多数副项目和库,两者都适用。
  • BUSL 和 SSPL 是源可用软件,而非开源软件。在评估依赖项时,将它们视为专有软件。
  • 使用自动化工具(license-checker、pip-licenses)审计你的依赖树,并将许可证检查添加到 CI 中。传递性依赖是许可证惊喜隐藏的地方。

By Michael Sun

Founder and Editor-in-Chief of NovVista. Software engineer with hands-on experience in cloud infrastructure, full-stack development, and DevOps. Writes about AI tools, developer workflows, server architecture, and the practical side of technology. Based in China.

Leave a Reply

Your email address will not be published. Required fields are marked *

You missed