指南 · 06

GPL "only" vs "or later"

讲解 GPL 中「or any later version」一句的含义、Linux 内核坚持 GPL-2.0-only 的原因、GPL-2.0-only 与 GPL-3.0 不兼容的缘由以及选择标准。

最后核对:2026-09-23

关键的一句话

GNU 许可证建议的声明中包含以下一句话。

either version 3 of the License, or (at your option) any later version.

有了这句话,接收者就可以选择遵守指定版本或 FSF 此后发布的任何版本的条件。这就是「or later」(SPDX GPL-3.0-or-later)。如果删掉其中的「or later」部分、只写特定版本,就成为「only」(GPL-3.0-only)。

GPL-3.0 第 14 条和 GPL-2.0 第 9 条规定了这一结构。尤其是 GPL-2.0 第 9 条规定,如果程序完全没有写明版本号,就可以选择 FSF 发布的任何版本。因此,如果只放 LICENSE 文件而不说明版本条款,可能会被解释为与本意不同的含义。

为什么要加「or later」

FSF 推荐「or later」,理由是面向未来的兼容性。当法律和技术环境变化、新版 GPL 发布时,「or later」代码可以自然地与新版本结合。事实上,GPL-2.0-or-later 代码可以直接放进 GPL-3.0 项目,而 GPL-2.0-only 代码则不行。

GPL-3.0 第 14 条更进一步,允许指定「代理人(proxy)」。版权所有者指定的人公开决定是否接受以后的版本时,该决定即具有效力。

为什么选择「only」

「or later」也意味着预先同意尚未写出的许可证。如果 FSF 以后发布了包含与我意愿不同条件的新版本,接收者就可以选择该版本来使用我的代码。

Linux 内核是代表性案例。内核采用 GPL-2.0-only。林纳斯·托瓦兹公开表示反对 GPL-3.0 的安装信息条款(即所谓防 Tivo 化),而且内核中混杂着数千名贡献者的版权,实际上也无法更换许可证。

对兼容性的影响

GNU 许可证常见问题中的兼容性矩阵概括如下。

引入的代码 → 我的项目GPL-2.0-onlyGPL-2.0-or-laterGPL-3.0
GPL-2.0-only可以可以(组合作品为 2.0-only)不可以
GPL-2.0-or-later可以可以可以
GPL-3.0不可以可以(组合作品为 3.0)可以
LGPL-3.0不可以可以(组合作品为 3.0)可以

关键在于 GPL-2.0-only 与 GPL-3.0 无法相互接纳。两个许可证各自要求「不得附加额外限制」,而对方的附加条件(3.0 的专利和安装信息条款等)在另一方看来就是额外限制。更多组合可以在兼容性检查器中查看。

选择标准

标注方法

  1. LICENSE(或 COPYING)中原样放入相应版本的原文。原文本身并不区分 only 和 or-later。
  2. 通过每个文件的声明和 SPDX 标识符说明版本条款。在生成器的文件头标签页中选择「only」或「or-later」,即可同时生成 GNU 官方声明和 SPDX 行。
  3. 在 README 中也用一句话写明(例如「Licensed under GPL-3.0-or-later」)。
本文为一般信息,不构成法律意见。重要决定请咨询专业人士。

参考来源