开源许可证合规

作者:鹿Sir法律合规v1

开源许可证合规与 SPDX 标准管理,涵盖许可证类型、兼容性检查、审计和 SBOM 生成。当用户{提到许可证合规、SPDX标识、许可证兼容性检查}时触发。触发词:开源许可证、SPDX、许可证兼容性、许可证审计。

下载量
330
点赞
83
价格
¥1.49
精选

技能文档

---
name: claude-dev-suite-license-compliance
title: 开源许可证合规
category: 开发工具
description: 开源许可证合规与 SPDX 标准管理,涵盖许可证类型、兼容性检查、审计和 SBOM 生成。当用户{提到许可证合规、SPDX标识、许可证兼容性检查}时触发。触发词:开源许可证、SPDX、许可证兼容性、许可证审计。
---

# 开源许可证合规

## 不适用场景
- **安全漏洞** - 使用供应链安全相关技能处理依赖安全
- **代码质量问题** - 使用代码质量相关技能处理 lint/复杂度
- **依赖中的密钥** - 使用密钥管理相关技能
- **包完整性** - 使用供应链相关技能处理 SBOM 和验证

## 官方参考

| 资源 | 链接 |
|------|------|
| SPDX 许可证列表 | https://spdx.org/licenses/ |
| SPDX 规范 | https://spdx.github.io/spdx-spec/ |
| OSI 批准的许可证 | https://opensource.org/licenses/ |
| 许可证选择指南 | https://choosealicense.com/ |
| license-checker | https://www.npmjs.com/package/license-checker-rseidelsohn |

---

## 许可证分类

### 按宽松程度

| 类别 | 许可证 | 商业使用 |
|------|--------|---------|
| **公共领域** | Unlicense, CC0-1.0 | 不受限制 |
| **宽松型** | MIT, Apache-2.0, BSD-3-Clause, ISC | 允许 |
| **弱 Copyleft** | LGPL-3.0, MPL-2.0, EPL-2.0 | 允许(有条件) |
| **强 Copyleft** | GPL-3.0, AGPL-3.0 | 必须开源 |
| **网络 Copyleft** | AGPL-3.0, SSPL-1.0 | 网络使用触发 |

### 常用 SPDX 标识符

| 许可证 | SPDX ID | OSI | FSF |
|--------|---------|-----|-----|
| MIT License | `MIT` | ✓ | ✓ |
| Apache 2.0 | `Apache-2.0` | ✓ | ✓ |
| BSD 3-Clause | `BSD-3-Clause` | ✓ | ✓ |
| ISC License | `ISC` | ✓ | ✓ |
| GPL 3.0 | `GPL-3.0-only` | ✓ | ✓ |
| GPL 3.0+ | `GPL-3.0-or-later` | ✓ | ✓ |
| LGPL 3.0 | `LGPL-3.0-only` | ✓ | ✓ |
| MPL 2.0 | `MPL-2.0` | ✓ | ✓ |
| AGPL 3.0 | `AGPL-3.0-only` | ✓ | ✓ |
| Unlicense | `Unlicense` | ✓ | ✓ |

---

## 兼容性矩阵

### 入站 → 出站

| 你的项目 | 可以包含 |
|---------|---------|
| MIT | MIT, BSD, ISC, Unlicense, CC0 |
| Apache-2.0 | MIT, BSD, ISC, Apache-2.0, Unlicense |
| LGPL-3.0 | MIT, BSD, ISC, Apache-2.0, LGPL, GPL(作为库) |
| GPL-3.0 | 大多数许可证(输出必须为 GPL) |
| 专有 | MIT, BSD, ISC, Apache-2.0(检查归属要求) |

### 不兼容组合

| 许可证 A | 不兼容于 |
|---------|---------|
| GPL-2.0-only | Apache-2.0(专利条款冲突) |
| GPL-3.0 | GPL-2.0-only |
| AGPL-3.0 | 专有 SaaS(网络条款) |
| SSPL-1.0 | 未经 OSI 批准,限制使用 |

---

## NPM 许可证审计

### license-checker

```bash
# 安装
npm install -g license-checker-rseidelsohn

# 基本扫描
license-checker

# JSON 输出
license-checker --json > licenses.json

# 仅摘要
license-checker --summary

# 仅生产依赖
license-checker --production

# 排除开发依赖
license-checker --production --json
```

### 白名单配置

```bash
# 仅允许特定许可证
license-checker --onlyAllow "MIT;Apache-2.0;BSD-3-Clause;ISC;0BSD"

# 遇到 Copyleft 许可证时报错
license-checker --failOn "GPL-3.0;AGPL-3.0;GPL-2.0"

# 排除特定包
license-checker --excludePackages "internal-pkg@1.0.0"
```

### @onebeyond/license-checker

```bash
npm install -g @onebeyond/license-checker

# 使用白名单扫描
npx @onebeyond/license-checker scan --allowOnly MIT Apache-2.0 BSD-3-Clause

# 检查 SPDX 合规性
npx @onebeyond/license-checker check "MIT OR Apache-2.0"
```

### license-compliance

```bash
npm install -g license-compliance

# 检查合规性
license-compliance --production --allow "MIT;ISC;Apache-2.0"

# 生成报告
license-compliance --report licenses.csv
```

---

## SBOM 生成

### CycloneDX

```bash
# 安装
npm install -g @cyclonedx/cyclonedx-npm

# 生成 SBOM
cyclonedx-npm --output-file sbom.json

# 指定格式
cyclonedx-npm --output-format XML --output-file sbom.xml

# 包含开发依赖
cyclonedx-npm --include-dev --output-file sbom.json
```

### SPDX

```bash
# 使用 Syft
syft . -o spdx-json > sbom-spdx.json

# 验证 SBOM
syft validate sbom-spdx.json
```

### package.json 中的 SBOM

```json
{
  "name": "my-package",
  "version": "1.0.0",
  "license": "MIT",
  "licenses": [
    {
      "type": "MIT",
      "url": "https://opensource.org/licenses/MIT"
    }
  ]
}
```

---

## CI 集成

### GitHub Actions

```yaml
name: License Compliance

on: [push, pull_request]

jobs:
  license-check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install dependencies
        run: npm ci

      - name: Check licenses
        run: |
          npx license-checker-rseidelsohn \
            --production \
            --onlyAllow "MIT;Apache-2.0;BSD-3-Clause;BSD-2-Clause;ISC;0BSD;Unlicense;CC0-1.0" \
            --excludePrivatePackages

      - name: Generate SBOM
        run: |
          npx @cyclonedx/cyclonedx-npm --output-file sbom.json

      - name: Upload SBOM
        uses: actions/upload-artifact@v4
        with:
          name: sbom
          path: sbom.json
```

### Pre-commit Hook

```json
// package.json
{
  "scripts": {
    "license:check": "license-checker --production --onlyAllow 'MIT;Apache-2.0;BSD-3-Clause;ISC'",
    "preinstall": "npm run license:check || true"
  }
}
```

---

## 许可证文件模板

### MIT License

```
MIT License

Copyright (c) [year] [fullname]

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```

### Apache 2.0 NOTICE

```
MyProject
Copyright [year] [owner]

This product includes software developed at
[Company Name] (https://www.example.com/).

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0
```

---

## 归属要求

### 按许可证类型

| 许可证 | 要求 |
|--------|------|
| MIT | 包含版权声明 + 许可证文本 |
| Apache-2.0 | 包含版权声明 + 许可证文本 + NOTICE 文件(如有) |
| BSD-3-Clause | 包含版权声明 + 许可证文本 |
| LGPL-3.0 | 提供修改部分的源代码 |
| GPL-3.0 | 提供完整源代码 |

### 生成归属文件

```bash
# 生成 NOTICES 文件
license-checker --production --customFormat '{"name": "", "version": "", "license": "", "repository": ""}' \
  | jq -r '.[] | "- \(.name)@\(.version) - \(.license)\n  \(.repository)\n"' \
  > NOTICES.md
```

### NOTICES.md 模板

```markdown
# Third-Party Notices

This project includes the following third-party software:

## MIT License

### lodash (4.17.21)
- Repository: https://github.com/lodash/lodash
- Copyright (c) JS Foundation and other contributors

### axios (1.6.0)
- Repository: https://github.com/axios/axios
- Copyright (c) 2014-present Matt Zabriskie

## Apache-2.0 License

### typescript (5.3.0)
- Repository: https://github.com/microsoft/TypeScript
- Copyright (c) Microsoft Corporation
```

---

## 风险评估

### 高风险(专有项目中应避免)

| 许可证 | 风险 | 缓解措施 |
|--------|------|---------|
| GPL-3.0 | Copyleft | 使用 LGPL 版本或替代方案 |
| AGPL-3.0 | 网络 Copyleft | 在 SaaS 产品中避免使用 |
| SSPL-1.0 | 服务限制 | 使用替代方案(如 MongoDB 替代) |
| CPAL-1.0 | UI 归属要求 | 检查 UI 展示要求 |

### 中等风险(需仔细审查)

| 许可证 | 风险 | 缓解措施 |
|--------|------|---------|
| LGPL-3.0 | 动态链接 | 确保使用动态链接 |
| MPL-2.0 | 文件级 Copyleft | 保持修改文件独立 |
| EPL-2.0 | 专利授权 | 审查专利条款 |

### 低风险(通常安全)

| 许可证 | 说明 |
|--------|------|
| MIT | 包含许可证/版权声明 |
| Apache-2.0 | 包含许可证 + NOTICE |
| BSD-3-Clause | 包含许可证/版权声明 |
| ISC | 包含许可证/版权声明 |

---

## 检查清单

### 初始设置
- [ ] 为项目选择合适的许可证
- [ ] 在仓库中添加 LICENSE 文件
- [ ] 在 package.json 中添加 license 字段
- [ ] 在 CI 中配置 license-checker

### 持续合规
- [ ] 添加新依赖前进行审计
- [ ] 在 PR 审查中拒绝不兼容的许可证
- [ ] 为发布版本生成 SBOM
- [ ] 维护 NOTICES 文件
- [ ] 审查更新中的许可证变更

### 发布
- [ ] 许可证文件包含在分发中
- [ ] 已生成第三方声明
- [ ] SBOM 附加到发布版本
- [ ] 无 Copyleft 违规

---

## 反模式

| 反模式 | 问题 | 正确做法 |
|--------|------|---------|
| 添加依赖前不检查许可证 | 法律风险,Copyleft 违规 | 在 CI 中使用 license-checker |
| 在专有软件中使用 GPL | 必须开源整个应用 | 使用 MIT/Apache 或将 LGPL 作为库 |
| 不创建 NOTICES 文件 | 违反许可证条款 | 从依赖生成 NOTICES |
| 忽略更新中的许可证变更 | 新版本可能有不同许可证 | 在 Dependabot PR 中审查许可证 |
| 使用无许可证的包 | 法律状态不明确 | 仅使用有明确许可证的包 |
| 混用 GPL-2.0 和 Apache-2.0 | 不兼容的许可证 | 选择兼容的技术栈 |

## 快速问题排查

| 问题 | 可能原因 | 解决方案 |
|------|---------|---------|
| license-checker 安装时失败 | package.json 缺少 license 字段 | 在 package.json 中添加 `"license": "MIT"` |
| 专有项目中发现 GPL 依赖 | 传递性依赖 | 寻找替代方案或作为独立服务使用 |
| 同一包有多个许可证 | 双重许可 | 选择兼容的许可证(通常 MIT/Apache) |
| SPDX 验证失败 | 无效的 SPDX 标识符 | 使用 spdx.org/licenses 中的精确 ID |
| 许可证白名单过于严格 | 阻止了常用许可证 | 将 ISC, 0BSD 添加到白名单 |
| 分发中缺少许可证文件 | 缺少 LICENSE 文件 | 在构建时将 LICENSE 复制到 dist/ |

使用说明

# 开源许可证合规

管理开源许可证合规与 SPDX 标准,涵盖许可证分类、兼容性检查、审计工具和 SBOM 生成。

## 适用场景

- 检查项目依赖的许可证是否合规
- 了解不同许可证的兼容性
- 生成 SBOM(软件物料清单)
- 在 CI 中集成许可证检查

## 使用示例

检查项目依赖的许可证合规性:

> 帮我扫描项目依赖的许可证,确保没有 GPL 等 Copyleft 许可证

助手会帮你:

1. 使用 license-checker 扫描所有生产依赖
2. 对比白名单(MIT、Apache-2.0、BSD-3-Clause 等)
3. 标记不兼容或高风险的许可证
4. 生成第三方归属声明文件
5. 可选:生成 CycloneDX 或 SPDX 格式的 SBOM

## 许可证风险速查

| 风险等级 | 许可证 | 建议 |
|---------|--------|------|
| 低 | MIT, Apache-2.0, BSD, ISC | 可放心使用 |
| 中 | LGPL-3.0, MPL-2.0 | 需确认链接方式 |
| 高 | GPL-3.0, AGPL-3.0 | 专有项目中避免使用 |

如何安装此技能?

访问技能市场,点击「安装」按钮,按提示将技能包放入 AI 编程助手的 skills 目录即可。

浏览技能市场

支持平台:Qoder · QoderWork · Claude · Codex 等 AI 编程助手

开源许可证合规 - ¥1.49 | 技能派