概述
容器镜像会分发其中的每个依赖,而部分许可证会把义务附加到分发行为上。GPL 库被链接进交付物可能要求公开源码,AGPL 服务则可能要求向网络用户提供源码。这些不是评审意见,而是产品发布那一刻就承担的义务。要让义务始终可控,唯一可靠的方式是在 CI 中盘点许可证,让每一次依赖变化在发布前都可见。
步骤
- 生成仅包含生产依赖的许可证清单:
npx license-checker-rseidelsohn --production --json --out licenses.json
- 对禁止的许可证直接失败并输出摘要:
npx license-checker-rseidelsohn --production \
--failOn 'GPL-3.0;AGPL-3.0;SSPL-1.0' --summary
- 需要例外时按包名与版本豁免,而不是关闭整条规则:
npx license-checker-rseidelsohn --production \
--excludePackages '[email protected]' \
--failOn 'GPL-3.0;AGPL-3.0' --summary
- 归档报告并与上一版本比较:
diff <(jq -S 'keys' licenses-previous.json) <(jq -S 'keys' licenses.json)
验证
预期在引入 GPL 或 AGPL 依赖后构建以退出码 1 结束,摘要中明确指出包名与许可证;仅包含宽松许可证时退出码为 0。清单文件应随发布产物归档,diff 中新出现的包会直接显示在发布检查单里。若开发依赖导致失败,说明命令缺少 --production,应只检查会被分发的代码。
注意事项
- 扫描器读取的是包声明的元数据,不覆盖捆绑或内联代码的完整许可证文本。
- 许可证义务属于法律问题,白名单是工程策略,不能替代法务意见。
- 例外必须绑定包名与版本并写明到期时间,升级后重新评估。
- 没有声明许可证的包应按“未授权”处理,而不是默认可自由使用。
- 只依赖黑名单会漏掉版本间许可证变更,保留并比较完整清单更可靠。