SPDX (Software Package Data Exchange) 是由 Linux 基金会牵头的一个国际标准项目,旨在标准化软件物料清单(SBOM)和许可证信息的交换方式。对于开发者和企业来说,最常接触到的是 SPDX License Identifiers(SPDX 许可证标识符)。本文是 SPDX 许可证的详细介绍、使用方法以及检测工具的指南。
SPDX License 介绍
它是做什么的?
在开源世界中,同一个许可证往往有多种叫法。例如 GPL v2、GPL 2.0、GPL2 可能指的都是同一个东西。这种混乱使得自动化工具难以识别和管理法律合规性。
SPDX 定义了一套**标准化的简写代码(ID)**来唯一标识每一个许可证。
- MIT 代表 MIT License
- Apache-2.0 代表 Apache License 2.0
- GPL-3.0-only 代表 GNU General Public License v3.0 only
为什么重要?
- 机器可读:自动化工具可以轻松扫描代码库,生成合规报告。
- 清晰明确:消除了
这是哪个版本的 GPL?的歧义。 - 行业标准:已被 ISO/IEC 5962 采纳为国际标准,是供应链安全(SBOM)的基础。
如何使用 SPDX 标识符
目前主流的做法是在源代码文件的顶部添加一行特定的注释,而不是把冗长的许可证全文粘贴进去。
基本语法
格式为:
SPDX-License-Identifier: <SPDX-ID>
2. 代码中的示例
C / C++ / Java / Go / Rust (使用 // 注释):
// SPDX-License-Identifier: MIT
Python / Shell / Perl (使用 # 注释):
# SPDX-License-Identifier: Apache-2.0HTML / XML (使用 <!-- --> 注释):
<!-- SPDX-License-Identifier: BSD-3-Clause -->复杂情况(组合许可证)
SPDX 支持布尔表达式来描述复杂的授权情况。
- 双重许可 (Dual Licensing):用户可以选择其中一个。使用
OR。 c// SPDX-License-Identifier: MIT OR Apache-2.0 - 多重许可:代码同时包含多个部分,必须同时遵守。使用
AND。 c// SPDX-License-Identifier: LGPL-2.1-only AND MIT - GPL 版本控制:SPDX 区分了
仅此版本和此版本或更高。GPL-2.0-only(仅限 v2.0)GPL-2.0-or-later(v2.0 或更高版本)
哪里查找标准 ID?
请务必使用官方列表中的确切 ID,不要自己造词。
SPDX 许可证的检测与扫描
检测代码库中使用了哪些许可证(License Compliance)以及是否包含 SPDX 标识符,通常需要借助扫描工具。
开源/命令行工具
-
ScanCode Toolkit (by nexB)
- 地位:业界最权威的许可证扫描引擎之一。
- 特点:能识别文本中的许可证声明,即使没有写 SPDX ID 也能识别出是哪个 License,并给出 SPDX ID。
- 使用:
scancode -cl ./my-project - https://github.com/aboutcode-org/scancode-toolkit/
-
FOSSology
- 地位:企业级合规平台(Web UI)。
- 特点:适合大型企业建立合规库,扫描精度极高,支持人工复核。
-
License-Checker (针对 Node.js)
- 使用:
npx license-checker - 特点:快速扫描
node_modules依赖树的许可证信息。
- 使用:
生成 SBOM (软件物料清单) 工具
现代 DevOps 流程中,通常使用生成 SBOM 的工具来自动提取 SPDX 信息。
- Syft (by Anchore)
- 能生成 SPDX 格式的 SBOM 文件(
.spdx.json)。 - 命令:
syft dir:. -o spdx-json
- 能生成 SPDX 格式的 SBOM 文件(
- Trivy (by Aqua Security)
- 既是漏洞扫描器,也是许可证扫描器。
- 命令:
trivy fs . --scanners license
在 CI/CD 中集成 (GitHub Actions)
你可以在代码提交时自动检测许可证合规性。
- reuse-tool (FSFE)
- Free Software Foundation Europe 提供的工具,专门用于强制执行 SPDX 最佳实践。
- 如果文件头缺少 SPDX ID,它会报错。
- 命令:
reuse lint - https://github.com/fsfe/reuse-action
最佳实践总结
- 新项目:从第一天起,就在每个源文件的第一行或第二行加上
SPDX-License-Identifier。 - 存量项目:使用
ScanCode或reuse工具扫描现有代码,批量添加或修正 Header。 - LICENSE 文件:虽然每个文件有了 ID,但项目根目录下仍需放置一份完整的
LICENSE文本文件(如LICENSE.txt或COPYING)。 - 避免歧义:尽量使用
-only或-or-later后缀来明确 GPL/LGPL 系列的许可证范围。