Earthworm许可证检查:开源许可证合规性验证
🎯 痛点场景
你是否曾经在开源项目中遇到过这样的困惑:项目使用了多个依赖包,每个依赖包都有自己的许可证,但你不确定这些许可证是否兼容?或者你想知道你的项目是否正确地遵守了所有开源许可证的要求?
开源许可证合规性是一个复杂但至关重要的问题。不正确的许可证使用可能导致法律风险、项目被下架,甚至面临诉讼。Earthworm作为一个使用AGPL-3.0许可证的开源项目,其许可证合规性验证尤为重要。
📋 读完本文你能得到
- Earthworm项目的完整许可证架构解析
- AGPL-3.0许可证的核心要求与合规性检查清单
- 多许可证兼容性分析方法与工具推荐
- 开源项目许可证管理的实战指南
- 避免常见许可证陷阱的最佳实践
🔍 Earthworm许可证架构分析
项目整体许可证
Earthworm主项目采用GNU Affero General Public License v3.0 (AGPL-3.0),这是一种强Copyleft许可证,具有以下特点:
子项目许可证分布
通过分析项目结构,我们发现Earthworm包含多个子模块,每个模块可能有不同的许可证声明:
| 模块 | 许可证类型 | 合规性状态 | 风险等级 |
|---|---|---|---|
| 主项目 (root) | AGPL-3.0 | ✅ 合规 | 低 |
| API服务 | UNLICENSED | ⚠️ 需确认 | 中 |
| DB包 | ISC | ✅ 兼容 | 低 |
| Game Data SDK | ISC | ✅ 兼容 | 低 |
| Docs文档 | ISC | ✅ 兼容 | 低 |
AGPL-3.0核心要求检查清单
🛠️ 许可证合规性验证工具
1. 使用Licensee进行自动化检查
# 安装licensee工具
gem install licensee
# 检查项目许可证
licensee detect ./
# 输出示例
License: AGPL-3.0
Confidence: 100.00%
Matcher: Licensee::Matchers::Exact
2. 依赖许可证扫描
# 使用npm-license-checker
npx license-checker --summary
# 使用yarn licenses
yarn licenses list
3. FOSSA集成检查
# 安装fossa-cli
curl -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/fossas/fossa-cli/master/install.sh | bash
# 分析项目依赖
fossa analyze
📊 多许可证兼容性矩阵
Earthworm项目涉及的主要许可证兼容性关系:
兼容性说明表
| 许可证组合 | 兼容性 | 使用条件 |
|---|---|---|
| AGPL-3.0 + MIT | ✅ 兼容 | MIT代码可嵌入AGPL项目 |
| AGPL-3.0 + ISC | ✅ 兼容 | ISC与MIT类似,完全兼容 |
| AGPL-3.0 + Apache-2.0 | ✅ 兼容 | 需保留Apache声明 |
| AGPL-3.0 + UNLICENSED | ⚠️ 风险 | 需要明确授权 |
🔧 Earthworm特定合规检查
1. API模块UNLICENSED状态验证
// apps/api/package.json 中的许可证声明
{
"name": "api",
"version": "0.1.0",
"private": true,
"license": "UNLICENSED"
}
合规性分析:
- ✅
private: true表明这是内部模块 - ⚠️
UNLICENSED需要明确使用条款 - 🔍 建议添加自定义许可证文件说明使用限制
2. 网络服务条款合规性
AGPL-3.0要求网络服务必须提供源代码访问:
🚨 常见风险与解决方案
风险1:许可证声明不一致
问题:package.json中的"license": "ISC"与根目录LICENSE文件内容不符
解决方案:
# 统一许可证声明
echo "确保所有package.json文件中的license字段与根目录LICENSE一致"
风险2:依赖许可证冲突
检测方法:
# 使用license-checker检查冲突
npx license-checker --json | grep -E "(GPL|AGPL|LGPL)"
风险3:第三方资源许可证
检查清单:
- 字体文件许可证
- 图片资源许可证
- 音频文件许可证
- 文档内容许可证
📝 合规性验证清单
基础检查项
- LICENSE文件存在且完整
- 所有package.json包含正确license字段
- 版权声明在所有源文件头部
- 修改历史记录完整
AGPL特定检查项
- 网络服务提供源代码访问说明
- 修改版本标注明确
- 用户界面包含许可证信息
- 对应源代码可获取
依赖检查项
- 所有依赖许可证兼容AGPL-3.0
- 无GPL-incompatible依赖
- 第三方资源有明确许可证
🎯 实战:为Earthworm添加许可证验证
步骤1:创建许可证检查脚本
// scripts/check-licenses.js
const { execSync } = require('child_process');
const fs = require('fs');
const path = require('path');
function checkRootLicense() {
const licensePath = path.join(__dirname, '..', 'LICENSE');
if (!fs.existsSync(licensePath)) {
throw new Error('LICENSE file not found in root directory');
}
const licenseContent = fs.readFileSync(licensePath, 'utf-8');
if (!licenseContent.includes('GNU AFFERO GENERAL PUBLIC LICENSE')) {
throw new Error('Root LICENSE is not AGPL-3.0');
}
console.log('✅ Root LICENSE verification passed');
}
function checkPackageLicenses() {
// 实现包许可证检查逻辑
}
checkRootLicense();
checkPackageLicenses();
步骤2:集成到CI流程
# .github/workflows/license-check.yml
name: License Compliance Check
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
license-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '20'
- name: Install dependencies
run: npm install -g licensee
- name: Check licenses
run: |
licensee detect ./
node scripts/check-licenses.js
📈 许可证管理最佳实践
1. 文档化许可证策略
# 许可证管理策略
## 允许的许可证
- MIT
- ISC
- Apache-2.0
- BSD-2-Clause
- BSD-3-Clause
## 需要审查的许可证
- GPL系列(需法律审查)
- AGPL(仅限兼容用途)
- 商业许可证
## 禁止的许可证
- 无明确许可证
- 与AGPL-3.0不兼容的许可证
2. 定期审计依赖
# 每月执行一次许可证审计
npx license-checker --csv > licenses-$(date +%Y-%m).csv
3. 开发者培训内容
🎓 总结与展望
Earthworm作为一个AGPL-3.0项目,在许可证合规性方面表现良好,但仍需注意:
- 持续监控:依赖许可证可能随时间变化
- 文档完善:明确UNLICENSED模块的使用条款
- 自动化检查:集成到开发流程中
- 团队教育:确保所有贡献者理解许可证要求
通过本文的合规性验证框架,你可以确保你的开源项目在享受开源协作好处的同时,避免潜在的法律风险。
💡 提示:定期使用
npx license-checker --summary检查项目依赖许可证状态,保持项目健康度。
点赞/收藏/关注三连,获取更多开源项目合规性指南!下期我们将深入探讨「开源项目贡献者协议的最佳实践」。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



