指南 · 05

SPDX 标识符与文件头

整理 SPDX-License-Identifier 和 SPDX-FileCopyrightText 文件头的写法、已弃用的标识符(GPL-2.0→GPL-2.0-only)、包元数据中的 license 字段以及 REUSE 规范。

最后核对:2026-09-23

什么是 SPDX

SPDX(Software Package Data Exchange,软件包数据交换)是 Linux 基金会旗下的项目,是以机器可读方式表示软件组件及其许可证信息的标准。2021 年成为国际标准 ISO/IEC 5962:2021。其中使用最广泛的是 SPDX 许可证列表中的简短标识符。它约定用一个 MIT 来代替「MIT License」「The MIT license」「MIT 许可证」等五花八门的名称。

文件头两行

在源文件顶部以注释形式加入以下两行,人和工具都能立即知道该文件的版权所有者和许可证。

// SPDX-FileCopyrightText: 2026 Jane Doe <jane@example.com>
// SPDX-License-Identifier: MIT

生成器的文件头标签页可以用 7 种注释格式生成这两行。

注意已弃用的标识符

从 SPDX 许可证列表 3.0(2017 年 12 月)起,改为在标识符中体现 GNU 许可证的版本条款。

已弃用的标识符当前标识符
GPL-2.0GPL-2.0-only
GPL-2.0+GPL-2.0-or-later
GPL-3.0GPL-3.0-only
LGPL-2.1LGPL-2.1-only
AGPL-3.0AGPL-3.0-only

因为如果只写 GPL-3.0,就无法知道是「only」还是「or later」。两种方式的区别整理在 only vs or-later 中。

包元数据

大多数包管理器都接受 SPDX 标识符或表达式。

生态文件示例
npmpackage.json"license": "MIT" · 闭源用 "UNLICENSED"
RustCargo.tomllicense = "MIT OR Apache-2.0"
Pythonpyproject.tomllicense = "Apache-2.0" (PEP 639)
Mavenpom.xml<licenses> 中写名称和 URL

npm 的 UNLICENSED 与「Unlicense」意思完全不同,表示这是不允许使用的闭源包。两者拼写相近,经常出错。

REUSE:让整个仓库机器可读

欧洲自由软件基金会(FSFE)的 REUSE 规范规定了在整个仓库中一致地应用 SPDX 文件头的方法。

  1. 将所有许可证原文以 SPDX标识符.txt 的名称放在 LICENSES/ 文件夹中(例如 LICENSES/MIT.txt)。
  2. 在每个文件中加入 SPDX-FileCopyrightTextSPDX-License-Identifier
  3. 无法加注释的文件(图片、JSON 等),通过旁边的 文件名.license 文件或仓库根目录的 REUSE.toml 记录信息。
  4. reuse lint 工具检查是否有遗漏的文件。

实务提示

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

参考来源