Nextcloud Server 文件授权声明指南:SPDX 头规范与 DCO 提交签核实践
Nextcloud server 采用「双许可文本(AGPL-3.0-only 与 AGPL-3.0-or-later)+ SPDX 文件头 + DCO 提交签核」的授权管理体系,不要求贡献者签署 CLA。本文围绕仓库中的 如何添加许可证指南 展开,完整覆盖新文件 SPDX 头写法、存量文件头更新规则、REUSE 清单机制以及 Developer Certificate of Origin(DCO)签核要求,并逐一给出仓库内真实文件作为参照,帮助你在为 Nextcloud server 提交代码前独立完成合规的版权标注与提交签名。
授权体系总览:双 AGPL 许可文本与无 CLA 政策
指南开头说明了 Nextcloud 的许可证沿革:项目最初使用 GNU AGPLv3 only,自 2016 年 6 月 16 日起切换为「GNU AGPLv3 or any later version」,目的是提升长期可维护性并加强法律层面的确定性。同时明确:Nextcloud 不要求 CLA(Contributor License Agreement),版权归属于每一位贡献者本人。
在仓库中可以找到这套政策的落地文件:
- COPYING:GNU AGPL 第 3 版完整许可文本,是所有文件的默认许可依据;
- COPYING-README:声明「Nextcloud 中的文件默认采用 AGPLv3(全文见
COPYING)或其后续版本,另有标注的除外」,并指出署名信息见 AUTHORS 文件; - AUTHORS:贡献者署名列表,文件头部自身也带有 SPDX 头(
AGPL-3.0-or-later,含 Nextcloud GmbH 与 ownCloud, Inc. 两条版权行)。
值得注意的是,仓库中的文件实际并存两种许可标识:AGPL-3.0-or-later(新代码)与 AGPL-3.0-only(较早的存量代码)。例如 version.php 头部为 SPDX-License-Identifier: AGPL-3.0-only,而 core/BackgroundJobs/CleanupBackgroundJobsJob.php 头部为 AGPL-3.0-or-later。这解释了为何指南要求修改存量文件时必须「保留原有头」——随意把旧文件的 -only 改成 -or-later 会改变法律语义。
为新文件添加 SPDX 许可证头
指南要求:创建新文件时使用 SPDX 许可证头,年份填创建年份,邮箱地址可选。按文件类型,仓库实际采用的注释风格如下。
前端源码(.js、.ts、.css 等)
指南给出的模板:
/**
* SPDX-FileCopyrightText: [year] [your name] [<your email address>]
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
仓库中的真实示例,如 core/src/public-page-menu.ts:
/**
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
可以看到机构贡献者使用「Nextcloud GmbH and Nextcloud contributors」作为署名;个人贡献者则写自己的姓名与(可选的)邮箱。
.vue 文件
由于 <template> 结构不适合块注释,指南规定 .vue 文件使用 HTML 注释:
<!--
- SPDX-FileCopyrightText: [year] [your name] [<your email address>]
- SPDX-License-Identifier: AGPL-3.0-or-later
-->
仓库实例见 core/src/components/AppIcon.vue,其头部完全符合该格式,注释之后紧跟 <template> 块。
后端源码(.php)
PHP 文件与 JS 前端使用同一种 docblock 风格:
/**
* SPDX-FileCopyrightText: [year] [your name] [<your email address>]
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
实例见 core/BackgroundJobs/CleanupBackgroundJobsJob.php(declare(strict_types=1); 之后紧跟 SPDX docblock)。
头元素说明
| 元素 | 取值规则 | 备注 |
|---|---|---|
SPDX-FileCopyrightText |
创建年份 + 姓名,可附 <email> |
邮箱可选;多个权利人行时按年逐行累加 |
SPDX-License-Identifier |
AGPL-3.0-or-later |
新代码的标准标识;存量 -only 文件见下节 |
修改存量文件时如何更新版权头
指南对存量文件的核心原则是:保留原有许可证头不动,仅追加自己的版权行。分两种情况:
- 文件已是「泛化头」(generic header),例如
2024 Nextcloud GmbH and Nextcloud contributors这类组织级署名——此时不必改文件头,只需把自己的姓名加入署名列表文件(指南文字写作 AUTHORS.md,本仓库根目录实际维护的署名文件是 AUTHORS); - 文件头是具体个人的版权行——直接在头中新增一行,指南给出的 diff 示例:
/**
* SPDX-FileCopyrightText: 2022 Alice <alice@nextcloud.local>
* SPDX-FileCopyrightText: 2023 Bob <bob@nextcloud.local>
+* SPDX-FileCopyrightText: [year] [your name] [<your email address>]
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
仓库中的多版权行实例见 lib/private/Group/Group.php:
/**
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-only
*/
这里可以观察到两个细节:一是年份可写成区间(2016-2024)表示持续维护的年份跨度;二是历史 ownCloud 时代文件保留着 AGPL-3.0-only 标识与 ownCloud, Inc. 的版权行——这正是不动旧头的实际效果。
配套机制:REUSE 清单与 LICENSES 目录
指南末尾提示 SPDX 头的完整规范以 REUSE 项目与 SPDX 官方规范为准(此处不再列出外部链接,可直接阅读仓库内文件自行对照)。仓库对 SPDX 的落地是 REUSE 合规模式,证据如下:
- REUSE.toml:REUSE 清单(
version = 1,SPDX-PackageName = "nextcloud"),为无法内嵌头的文件(生成的 l10n 翻译文件、字体、图标、第三方 stub 等)批量声明SPDX-FileCopyrightText与SPDX-License-Identifier,并大量使用precedence = "aggregate"; - LICENSES/ 目录:存放所有许可全文,包含 AGPL-3.0-only.txt、AGPL-3.0-or-later.txt,以及各类商标类自定义标识(如
LicenseRef-AppleAppStoreBadge.txt、LicenseRef-DCO.txt等)。
REUSE.toml 中大量 LicenseRef-* 标识说明:对商标素材等不便采用标准 SPDX 标识的文件,项目通过自定义 LicenseRef- 标识 + LICENSES/ 下对应全文的方式完成合规标注。普通贡献者提交的源码文件一般只需按前两节的模板写文件头,无需触碰清单文件。
DCO:提交签核(Sign-off)要求
指南最后一节要求所有贡献满足 DCO(Developer Certificate of Origin),完整文本见 contribute/developer-certificate-of-origin(Linux 基金会 V1.1 版本),其 .license 附件以 LicenseRef-DCO 标识自我标注。DCO 的核心是贡献者对以下声明的背书:贡献由本人创作或有权提交、基于已许可的先前作品、由他人直接提供且未修改,以及理解贡献记录(含签核信息)将被永久保留并随项目分发。
具体操作在 .github/CONTRIBUTING.md 的「Sign your work」一节中有明确规定:
- 每个 git commit 消息中追加一行:
Signed-off-by: 姓名 <邮箱>; - 必须使用真实姓名,不接受匿名或化名提交;
- 配置好
user.name与user.email后,可用git commit -s自动追加签核行; - 可以设置别名简化操作,如
git config --global alias.ci 'commit -s',之后用git ci提交即自动签核。
同一文件中的「Apply a license」小节反向链接到本文档,说明在仓库工作流里,许可证头规范(本文)与 DCO 签核是提交前的两道并列检查项。
提交前自检清单
- 新文件:按语言选择注释风格(JS/TS/CSS 与 PHP 用
/** */块注释,.vue用 HTML 注释),写入创建年份、署名与SPDX-License-Identifier: AGPL-3.0-or-later; - 存量文件:只追加自己的
SPDX-FileCopyrightText行,不改年份区间、不改动原有SPDX-License-Identifier(尤其注意-only与-or-later的区别); - 若文件是组织级泛化头,改为在 AUTHORS 中添加自己;
- 每个提交携带
Signed-off-by: 真实姓名 <邮箱>(推荐git commit -s); - 生成的翻译文件、图标等无需逐一手写头,其归属由 REUSE.toml 统一管理,贡献时保持原状即可。
按以上清单操作,即可在不签署任何 CLA 的前提下,以版权归属个人的方式合规地向 Nextcloud server 贡献代码。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00