指南 · 04

双重(多重)许可

讲解为同一份代码提供两个或以上许可证的双重许可的两种类型、SPDX 表达式 OR、AND、WITH 的含义,以及需要 CLA 的原因和注意事项。

最后核对:2026-09-23

为什么给一份代码多个许可证

版权所有者可以同时以多种条件许可同一份代码。接收者只需选择其中一个并遵守其条件即可。这样做的目的主要有两个。

  1. 扩大兼容性 — 为了与不同的生态都能良好契合。
  2. 商业模式 — 在以开源发布的同时,另行销售商业许可证。

类型 1:同时提供两个宽松型许可证 — MIT OR Apache-2.0

这是 Rust 语言和大多数 Rust crate 采用的方式。用户可以在 MITApache-2.0 中任选其一。

相当于兼得两者的优点,因此深受库作者欢迎。按惯例,仓库中会放置 LICENSE-MITLICENSE-APACHE 两个文件。

类型 2:著佐权 + 商业 —「要么 GPL,要么付费」

将代码以 GPLAGPL 公开,同时通过单独合同向不愿承担公开源代码义务的企业销售商业许可证。MySQL(GPL + Oracle 商业许可)、Qt(LGPL-3.0/GPL + 商业)是代表性案例。

这种模式只有在版权所有者拥有全部代码的权利时才能运作。因为对于外部贡献者仅以 GPL 贡献的代码,版权所有者无权以商业许可证出售。

CLA 与 DCO

用 SPDX 表达式书写

多个许可证之间的关系用 SPDX 许可证表达式书写。

表达式含义示例
A OR B二者任选其一遵守(选择型双重许可)MIT OR Apache-2.0
A AND B两者都须遵守(不同部分混合的情况)MIT AND BSD-3-Clause
A WITH 例外为许可证附加例外条款GPL-2.0-only WITH Linux-syscall-note
括号指定组合顺序(MIT OR Apache-2.0) AND Unicode-3.0

如果把 ORAND 弄混,意思就会完全相反。用户可以选择时用 OR,必须全部遵守时用 AND

注意事项

应用示例

要应用 Rust 风格的双重许可,可以在生成器中分别获取 MIT 和 Apache-2.0 文件,保存为 LICENSE-MITLICENSE-APACHE,并在元数据中写上 license = "MIT OR Apache-2.0"。每个文件头中写 SPDX-License-Identifier: MIT OR Apache-2.0

本文为一般信息,不构成法律意见。重要决定请咨询专业人士。

参考来源