本文目录导读:

- 核心理念:保持简单和友好
- 选择协议类型:DCO vs. CLA
- 核心条款设计(以 CLA 为例)
- 操作流程设计
- 最佳实践与避坑指南
- 一个简单的 CLA 模板(基于 Apache 2.0 许可)
- 快速决策表
设计开源项目的贡献者协议(Contributor Agreement)需要平衡项目法律合规性与贡献者体验,一个设计不当的协议(如过于复杂的 CLA 或过于严苛的版权转让)可能会劝退潜在的贡献者。
以下是一份设计开源项目贡献者协议(通常包括 CLA 或 DCO)的完整指南,分为核心理念、协议类型、核心条款设计、操作流程和最佳实践五个部分。
核心理念:保持简单和友好
- 降低门槛:协议应尽可能短、易懂,鼓励使用开发者原创证书(DCO,Developer Certificate of Origin) 而非复杂的 CLA。
- 明确授权:清晰说明贡献者授予项目哪些权利,以及项目(尤其是维护者)可以用这些代码做什么。
- 保护贡献者:贡献者不应因此承担额外责任(如专利诉讼风险)。
- 合规性:确保项目可以重新许可(从 GPL 迁移到 MIT,或进行商业化)。
选择协议类型:DCO vs. CLA
这是最关键的选择。
DCO(Developer Certificate of Origin,推荐首选)
- 原理:贡献者只需在提交信息中添加
Signed-off-by: Your Name <email>,这表示贡献者同意 DCO 声明(即保证自己有权提交此代码,且同意项目按现有许可证使用)。 - 优点:
- 极其简单,几乎零摩擦。
- 被 Linux 内核、Git 等大型项目广泛采用。
- 不涉及法律文件签署。
- 适用场景:几乎所有纯开源项目,尤其是不希望吓跑贡献者的项目。
CLA(Contributor License Agreement,需要签署)
- 原理:贡献者需要签署一份正式的法律文件(通常通过在线系统,如 CLA Assistant 或 EasyCLA)。
- 类型:
- 版权转让(Copyright Assignment):贡献者将代码版权 完全转让 给项目或公司(如 Fiduciary License Agreement)。不推荐,对贡献者不友好。
- 版权许可(Copyright License):贡献者保留版权,但授予项目/公司 广泛的、永久的、不可撤销的许可(包括商业使用、再许可)。更常见。
- 优点:
- 保护项目免受专利诉讼、代码来源不明等法律风险。
- 允许项目(尤其是公司主导的项目)在未来更改许可证(如从 GPL 改为商业许可证)。
- 明确知识产权的归属和授权范围。
- 适用场景:
- 公司主导的大型项目(如 Google、Meta 的项目)。
- 项目计划采用双许可证模式(开源 + 商业授权)。
- 高风险领域(如涉及加密、医疗、金融的代码)。
核心条款设计(以 CLA 为例)
如果你决定使用 CLA,以下条款是必须认真设计的:
定义条款
- “贡献”:明确包含所有提交的代码、文档、补丁、提议等。
- “项目”:指代的开源项目本身。
许可授予(核心)
这是 CLA 的心脏。
-
版权许可:
- 授予项目(及维护者)一个 永久的、全球性的、免版税的、非排他的、不可撤销的 许可。
- 允许项目使用、复制、修改、展示、分发和制作衍生作品。
- 允许再许可(Sublicense):这一点很关键,允许项目以不同的许可证条款(如商业许可证)使用你的贡献。
- 明确不限制贡献者:声明此许可不影响贡献者自己继续使用或单独授权其贡献的权利。
-
专利许可(Patent Grant):
- 如果贡献者持有相关专利,应授予项目一个 对因使用贡献而可能被侵犯的专利的许可。
- 保护伞条款:如果贡献者向项目(或项目用户)提起专利诉讼,则自动撤销此专利许可,这是防止“专利流氓”或“潜水艇专利”的标准做法。
代表与保证
- 所有权保证:贡献者保证其贡献是原创的,或者有权代表其雇主提交。
- 第三方权利:贡献者保证其贡献不侵犯任何第三方的版权、专利或商业秘密(即不抄袭)。
- 安全性:贡献者承诺其代码不包含恶意软件或后门。
- 免责:贡献者明确声明 “按现状”提交,不提供任何形式的明示或默示保证(如适销性或适用性)。
责任限制
- 贡献者不对因使用或分发其贡献而产生的任何损害承担责任。
签署方式
- 个人签署:需明确是个人身份提交。
- 雇主签署(Corporate CLA):如果贡献者在工作时间内为公司提交代码,通常需要公司实体签署一份 Corporate CLA,然后个人贡献者通过个人 CLA 声明自己有权限提交,这避免了公司内部律师的繁琐流程。
操作流程设计
-
包含 DCO(最简单):
- 在
CONTRIBUTING.md中说明:“所有提交必须通过-s或--signoff选项进行签名。” - 使用 Git钩子或 CI(持续集成)工具(如 DCO Bot)自动检查提交信息是否包含
Signed-off-by。
- 在
-
实施 CLA(推荐工具):
- CLA Assistant:一个 GitHub/GitLab App,能自动检查 PR(Pull Request)贡献者是否已签署 CLA,未签署则阻止合并,提供可定制的模板。
- EasyCLA (Linux Foundation):适合大型企业级项目。
- 流程:
- 贡献者提交 PR。
- CI(持续集成)/ Bot 提示“需要签署CLA”。
- 点击链接,跳转到 CLA 签署页面(支持个人和公司签署)。
- 签署后,Bot 更新 PR 状态为“CLA 已签署”。
- 项目维护者可以合并。
最佳实践与避坑指南
-
开源社区 vs. 法律保护的平衡:
- 不友好:要求全球客服贡献者手动填写 PDF 并发送邮件。友好:使用 DCO 或在线点击式 CLA 工具。
- 过分:要求版权完全转让(即贡献者以后不再拥有自己的代码)。合理:仅要求非排他性免版税许可。
-
模板建议:
- DCO:直接使用 Linux Foundation 的 DCO 文本。
- CLA:建议参考 Apache ICLA(个人贡献者许可协议,Individual Contributor License Agreement) 或 Google CLA(它们经过了大量实践检验)。
- 开源: Apache CLA 是黄金标准,适合绝大多数开源项目。
- 商业友好: 如果需要双许可证,可以考虑修改 Hart 的模板。
-
公司背景项目:
- 必须设计 Corporate CLA,让公司而不是每个员工签署,否则员工离职后,原公司可能声称拥有代码版权。
-
避免“继承性”问题:
- CLA 中关于“派生作品”的授权要清晰,好的 CLA 允许项目将贡献的代码许可给其他人,无论他们是否也签署了 CLA(即:项目的最终用户无需签署 CLA 就能使用开源版本)。
-
常见错误:
- CLA 与项目实际许可证冲突(如CLA说代码可商用,但项目是AGPL(Affero GPL,更强的 Copyleft 协议,要求网络服务也开源))。
- CLA 语言过于晦涩(法律术语过多)。
- 没有处理贡献者的专利反诉问题(前文提到的“如果起诉则撤销授权”)。
一个简单的 CLA 模板(基于 Apache 2.0 许可)
你可以基于这个结构起草:
贡献者许可协议(CLA)
前言:
本协议(“协议”)由________________(“贡献者”)与________________(“项目”)签订。
1. 定义
“贡献”指由贡献者有意提交给项目以包含在项目中的所有代码、文档或其他原创作品。
2. 版权许可授予
贡献者授予项目一个永久的、全球性的、非排他性的、免版税的、不可撤销的版权许可,以复制、准备衍生作品、公开展示、公开表演、再许可和分发贡献及此类衍生作品。
3. 专利许可授予
贡献者授予项目一个永久的、全球性的、非排他性的、免版税的、不可撤销的专利许可,基于其贡献,如果贡献者对项目或其用户提起专利侵权诉讼,则此许可自动终止。
4. 代表与保证
贡献者保证:(a) 其是贡献的原创作者,或有权提交; (b) 贡献不侵犯第三方权利; (c) 其拥有授予本协议中权利所需的全部许可。
5. 免责声明
贡献按“现状”提供,不附带任何明示或默示的保证。
6. 签署
本协议通过电子方式确认。
快速决策表
| 项目类型 | 推荐方案 | 原因 |
|---|---|---|
| 个人/小团队开源项目 | DCO | 零摩擦,低维护成本 |
| 中型社区项目(如 Vue, React 早期) | 简单 CLA(非版权转让) | 兼顾法律保护与友好度 |
| 大型公司主导项目(如 Go, CUDA) | 严格的 CLA + 公司协议 | 确保商业灵活性,保护知识产权 |
| 旨在被大公司采用的项目 | Corporate CLA | 确保公司雇员合规贡献 |
最后建议:在最终确定前,请咨询熟悉开源法律的律师,本文档不构成法律建议。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播