摘要

  • SPDX 表达式是一种有明确语法的许可信息表示,不是合规、授权、发布或部署的结论。
  • 包作者的声明、文件中实际发现的信息与 SPDX 文档创建者的结论分别回答不同问题。
  • 将记录来源、范围、差异说明和独立决定保留下来,才能在信息变化时修正,而不虚构原本不存在的批准。

先问这条字符串从哪里来

MIT、GPL-2.0-only OR BSD-3-Clause 或带有 WITH 的组合,看上去像一个简洁的最终答案。它们可以让工具和读者以同一格式传递许可信息,避免每次重新解释自然语言文件头。这种便利是真实的。但读者常常在这条字符串后面补上一个它并未作出的判断:软件是否已合规、能否交付、是否可以用于某个环境。

SPDX 3.0.1 对表达式所做的是定义表示方式:标识符、引用、例外以及 AND、OR、WITH、+ 的组合如何构成有效表达式。语法能说明字符串是否符合这一表示规则,却不能证明信息覆盖了每个文件,也不能确定某个组织采用了什么政策、谁拥有决定权或决定适用于哪个制品。

SPDX 对自身角色的说明很克制:它收集和传递事实,不对许可证或许可证合规作法律解释。这个限制不是缺陷。正因如此,一份 SPDX 记录可以在不同组织之间流动,而不要求它们共享同一份合同、风险标准或部署责任。共同的记录格式不自动创造共同的决定。

三种记录,三种提问

包级的 Declared License 记录的是包作者所声明的许可证信息。规范特别指出,从第三方仓库得到的信息不应写入该字段。它的来源因此必须保持清楚:它回答的是作者声明了什么,而不是后来某位分析者对整个项目得出了什么判断。

该字段出现表达式、NONE、NOASSERTION 或缺失,都有格式上的信息意义;没有一种状态天然等同于“没有许可证”“没有义务”或“允许继续”。把信息空缺修饰成可行动的绿灯,只会使下一位审阅者看不见原始的不确定性。

Concluded License 是另一种记录。它保存 SPDX 文档创建者对于适用于包的许可证所作的结论,或在无法确定时使用替代值。结论可以有价值,但它的作者不同于包作者。两者即使使用同一套表达式,也不会相互取代。规范要求:如果 concluded 与 declared 不同,应在许可证评论中保留书面解释。文件级规范同样把“文件中实际发现的许可信息”与文档创建者的 concluded license 分开,并要求解释差异。

这种分离让更正成为可能。文件发生变化时,针对该文件的观察可以改变;新结论可以说明它依据了什么新观察。旧记录无需被悄悄抹去。差异不是必须消灭的噪音,而是来源、范围或判断路径发生变化的证据。

决定在表达式之外

组织可能随后要决定是否追加审查、是否按自己的规则处理某次交付、是否暂停分发或是否部署。本文引用的 SPDX 来源不为任何具体包、文件、产品或交易作出这些决定;它们不指定司法辖区、政策所有者、例外程序或商业结果。

因此,不应走向两个极端。其一,把一个格式正确的表达式夸大为合规结论;其二,因为它不能完成所有判断就把它视为无用。更稳妥的做法是让它承担自身能承担的工作:指出作者声明、文件观察或文档结论的确切内容,使后续审查有可复现的起点,并暴露不同记录之间的差异。

表达式与决定回执

一个简短的“表达式与决定回执”并不修改 SPDX,也不提供法律意见。它首先固定范围:哪个文件、包、制品或版本,以及可用时的稳定引用。接着标明记录类型:作者声明、文件观察还是文档创建者结论;并保留原始表达式及其来源。

若结论与声明或观察不同,回执应保留原因,而不是让后一项覆盖前一项。决定部分则必须独立存在:只有确实有决定时,才记录决定所有者、政策版本、范围和时间。没有决定时,诚实的状态是“未评估”,而不是让一个整洁的标识符被误读为许可。

这样,作者、观察者、文档创建者和政策决定者各自保有自己的边界。相同的 SPDX 语法不能把任何一方的角色扩大成另一方的授权。

来源

  1. SPDX — Overview
  2. SPDX Specification 2.3 — Package Information
  3. SPDX Specification 2.2.2 — File Information
  4. SPDX Specification 3.0.1 — License Expressions