# 依赖许可证检查

解析项目依赖，识别每个第三方包的许可证类型，标记潜在冲突。

## 检查步骤

### 1. Go 依赖列表提取

```bash
# 提取直接依赖
grep -E '^\s+github\.com|^\s+golang\.org|^\s+gopkg\.in' go.mod | awk '{print $1}'

# 提取间接依赖
grep 'indirect' go.mod | awk '{print $1}'
```

### 2. 许可证识别

对于每个依赖，通过查找其源代码中的 LICENSE 文件或 go.mod 注释来判断许可证。

优先级：
1. 依赖包的 LICENSE / LICENSE.md / LICENSE.txt 文件
2. 依赖包的 go.mod 中 `// License:` 注释
3. 包文档站点（如 pkg.go.dev）上的元数据
4. GitHub 仓库元数据中的 `license` 字段

### 3. Copyleft 传染性检查

重点标记以下许可证，它们可能与宽松型项目许可证（MIT、Apache-2.0、BSD、MulanPSL）不兼容：

| 许可证 | 传染性 | 兼容性 |
|--------|--------|--------|
| GPL-2.0 | 强传染 | 与宽松型许可证不兼容 |
| GPL-3.0 | 强传染 | 可与 Apache-2.0 单向兼容（GPLv3 可使用 Apache-2.0 代码，反之不行） |
| AGPL-3.0 | 极强传染（含网络使用） | 与所有宽松型许可证不兼容 |
| LGPL-2.1 | 弱传染（仅修改库本身需开源） | 动态链接时兼容 |
| LGPL-3.0 | 弱传染 | 动态链接时兼容 |
| MPL-2.0 | 文件级传染 | 与宽松型许可证兼容 |

### 4. 许可证缺失检查

检查每个依赖是否明确声明了许可证：

```bash
# 示例：检查某个依赖的许可证
go mod download -json github.com/spf13/cobra 2>/dev/null | grep Dir
# 然后查看 $Dir/LICENSE*
```

## Go 依赖许可证速查表

以下是 gitlink-cli 项目实际使用的依赖及其许可证：

| 依赖 | 许可证 | 类型 |
|------|--------|------|
| `github.com/spf13/cobra` | Apache-2.0 | 宽松型 |
| `github.com/spf13/pflag` | BSD-3-Clause | 宽松型 |
| `github.com/zalando/go-keyring` | MIT | 宽松型 |
| `golang.org/x/term` | BSD-3-Clause | 宽松型 |
| `golang.org/x/sys` | BSD-3-Clause | 宽松型 |
| `gopkg.in/yaml.v3` | MIT | 宽松型 |
| `github.com/danieljoos/wincred` | MIT | 宽松型 |
| `github.com/godbus/dbus/v5` | BSD-2-Clause | 宽松型 |
| `github.com/inconshreveable/mousetrap` | Apache-2.0 | 宽松型 |
| `github.com/kr/pretty` | MIT | 宽松型 |
| `gopkg.in/check.v1` | BSD-2-Clause | 宽松型 |

## 检查命令

```bash
# 列出所有依赖
go list -m all 2>/dev/null

# 检查每个依赖的许可证
go list -m -json all 2>/dev/null | grep -E '"Path"|"Dir"'
```

## 输出示例

```
== 依赖许可证报告 ==

直接依赖: 5 个
间接依赖: 6 个
Copyleft 依赖: 0 个 ✓
许可证缺失: 0 个 ✓

许可分布:
  MIT:        5 (45%)
  BSD-3-Clause: 3 (27%)
  Apache-2.0:   2 (18%)
  BSD-2-Clause: 1 (9%)

结论: 所有依赖均为宽松型许可证，与项目 Mulan PSL v2 兼容，无传染风险。
```
